利用反射 和 comparator 实现List 的简单排序

来源:互联网 发布:职场女性英文名知乎 编辑:程序博客网 时间:2024/04/28 15:42

对博友的文章http://blog.csdn.net/Ice0River/article/details/1643407进行了修改


一 、 测试bean 


public class TestBean {

  private String strId;
  private String strName;
 
  public String getStrId() {
    return strId;
  }
  public void setStrId(String strId) {
    this.strId = strId;
  }
  public String getStrName() {
    return strName;
  }
  public void setStrName(String strName) {
    this.strName = strName;
  }
}


二 、实现 Comparator 接口


import java.lang.reflect.Method;
import java.util.Comparator;
public class MyCompatrator implements Comparator<TestBean> {
 
  private String strGetterNameOfSortField;   
   
  public void setStrGetterNameOfSortField(String strGetterNameOfSortField) {

      this.strGetterNameOfSortField = strGetterNameOfSortField;
  }
 
  public int compare( TestBean objLeft,  TestBean objRight){
    String strMethodName = strGetterNameOfSortField;
    String strValueLeft  = null;
    String strValueRight = null;   
    

    int cmpResult = 0;
   
    try {
      Class clsBean =  TestBean.class;       
      Method  objMethod = clsBean.getDeclaredMethod(strMethodName);
     
      strValueLeft = objMethod.invoke(objLeft).toString();
      strValueRight = objMethod.invoke(objRight).toString();

    }

   catch (SecurityException e)
{
// TODO Auto-generated catch block
e.printStackTrace();

cmpResult = (objLeft.getStrId() > objRight.getStrId() ? 1 : -1);

return cmpResult;

catch (NoSuchMethodException e)
{
// TODO Auto-generated catch block
e.printStackTrace();

cmpResult = (objLeft.getStrId() > objRight.getStrId() ? 1 : -1);

return cmpResult;
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();

cmpResult = (objLeft.getStrId() > objRight.getStrId() ? 1 : -1);

return cmpResult;

catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();

cmpResult = (objLeft.getStrId() > objRight.getStrId() ? 1 : -1);

return cmpResult;

catch (InvocationTargetException e)
{
// TODO Auto-generated catch block
e.printStackTrace();

cmpResult = (objLeft.getStrId() > objRight.getStrId() ? 1 : -1);

return cmpResult;
}

if (null != strValueLeft  && null != strValueRight)
{
cmpResult = strValueLeft .compareTo(strValueRight);
} else if (null == strValueLeft  && null != strValueRight )
{
cmpResult = -1;
} else if (null != strValueLeft  && null == strValueRight)
{
cmpResult = 1;
} else if (null == strValueLeft  && null == strValueRight)
{
cmpResult = 0;
}


// 如果两个节点排序属性值相等,按照节点索引标识排序
if (0 == cmpResult)
{
cmpResult = (objLeft.getStrId() > objRight.getStrId() ? 1 : -1);
}

return cmpResult;
  }
}


三 、 测试

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

 

public class TestSort {

  public static void main(String args[]) {
    List lstTestData = new ArrayList();
    MyCompatrator myComparator = new MyCompatrator();
   
    for (int intLoop = 0; intLoop < 10; intLoop++) {
      TestBean testBean = new TestBean();
      testBean.setStrId(String.valueOf(intLoop));
      testBean.setStrName(String.valueOf(10 - intLoop));
      lstTestData.add(testBean);
    }
   
    for (int intLoop = 0; intLoop < 10; intLoop++) {
      TestBean testBean = (TestBean)lstTestData.get(intLoop);
      System.out.println(testBean.getStrId() + "  " + testBean.getStrName());
    }
    myComparator.setStrGetterNameOfSortField("getStrName");
    myComparator.setBlnSortRule(false);
    myComparator.setStrBeanName("TestBean");   
    Collections.sort(lstTestData, myComparator);
   
    for (int intLoop = 0; intLoop < 10; intLoop++) {
      TestBean testBean = (TestBean)lstTestData.get(intLoop);
      System.out.println(testBean.getStrId() + "  " + testBean.getStrName());
    }
  }
}


总结

实现简单排序,只对String 类型进行了排序,且未考虑bean 内字段为空的情况

原创粉丝点击