本文针对 java 开发过程中经常遇到的一个问题——对 list 数据进行排序,进行讨论,并开发了一个万能排序方法,供大家参考讨论。
list 排序普通做法
重载 Comparator 类
代码如下:
List list = new ArrayList();
//......
Collections.sort(list, new MyComparator());
class MyComparator implements Comparator
{
//这里的o1和o2就是list里任意的两个对象,然后按需求把这个方法填完整就行了
public int compare(Object o1, Object o2)
{
//比较规则
}
}
这种方法实现比较容易,但是针对不同对象的列表都需要重载方法,会显得代码比较臃肿。
网上的一种万能方法
参考链接:http://blog.youkuaiyun.com/5iasp/article/details/17717179
此链接中提供了一种能实现所有对象列表的排序方法,但是依然存在如下问题:
1.用到了泛型,而且实现相对复杂;
2.扩展性并不是很好。
万能排序方法
针对实际需求和网上现有方法存在的问题,利用 java.lang.reflect.Field 开发了万能排序方法。
实体类
public class TestBean {
private Integer intVar;
private String stringVar;
private Boolean booleanVar;
public Integer getIntVar() {
return intVar;
}
public void setIntVar(Integer intVar) {
this.intVar = intVar;
}
public String getStringVar() {
return stringVar;
}
public void setStringVar(String stringVar) {
this.stringVar = stringVar;
}
public Boolean getBooleanVar() {
return booleanVar;
}
public void setBooleanVar(Boolean booleanVar) {
this.booleanVar = booleanVar;
}
}
排序类
class ComparatorList implements Comparator {
private String proName;
private String proType = "string";
public ComparatorList(String proName){
this.proName = proName;
}
public ComparatorList(String proName, String proType){
this.proName = proName;
this.proType = proType;
}
public int compare(Object obj0, Object obj1) {
Object value0 = getFieldValueByName(obj0);
Object value1 = getFieldValueByName(obj1);
if(value0 != null && value1 != null){
if(this.proType.equals("string")){
return (value0.toString().toLowerCase()).compareTo(value1.toString().toLowerCase());
}
//此处可根据不同条件进行扩展,比如整数int,或者ip规则等。
}
return 0;
}
public Object getFieldValueByName(Object obj){
try {
Field field = obj.getClass().getDeclaredField(this.proName);
field.setAccessible(true);
return field.get(obj);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
测试程序
public static void test(){
List<TestBean> testBeanList = new ArrayList<TestBean>();
TestBean testBean = new TestBean();
testBean.setStringVar("444");
testBeanList.add(testBean);
testBean = new TestBean();
testBean.setStringVar("gggg");
testBeanList.add(testBean);
testBean = new TestBean();
testBean.setStringVar("hddg");
testBeanList.add(testBean);
testBean = new TestBean();
testBean.setStringVar("53ddd");
testBeanList.add(testBean);
testBean = new TestBean();
testBean.setStringVar("3dfs");
testBeanList.add(testBean);
for(TestBean portService1:testBeanList){
System.out.println("---"+portService1.getStringVar());
}
ComparatorList comparatorList = new ComparatorList("stringVar","string");
Collections.sort(testBeanList,comparatorList);
Collections.reverse(testBeanList);
for(TestBean portService1:testBeanList){
System.out.println("***"+portService1.getStringVar());
}
}
测试结果
---444
---gggg
---hddg
---53ddd
---3dfs
***hddg
***gggg
***53ddd
***444
***3dfs
==========================================
疑问?帮助?批评?欢迎评论 | QQ:593159978