这里继续说有关List对象利用Sort方法进行排序,在java开发中我们经常会使用List进行排序,上篇说到可以每次根据需求编写实现Collections.sort(list, new Comparator() {}) 。然而对于经常通过利用实体类的属性进行比较排序,每次重复写这样的实现很麻烦,下面介绍通用的排序实现。
实体类A
/**
*
实体类A
*/
public class A{
public A( String name, int num) {
this.name = name;
this.num= num;
}
private String name;
private int num;
public String getName() {
return name;
}
public void setName(String name) {
this.name= name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num= num;
}
}
- 排序通用工具类
public class ListSort<E> {
/**
*
* @param list 要排序的集合
* @param method 要排序的实体的属性所对应的get方法
* @param sort desc 为降序
*/
public void Sort(List<E> list, final String method, final String sort) {
// 用内部类实现排序
Collections.sort(list, new Comparator<E>() {
public int compare(E a, E b) {
int ret = 0;
try {
// 获取m1的方法名
Method m1 = a.getClass().getMethod(method, null);
// 获取m2的方法名
Method m2 = b.getClass().getMethod(method, null);
if (sort != null && "desc".equals(sort)) {
ret = m2.invoke(((E)b), null).toString().compareTo(m1.invoke(((E)a),null).toString());
} else {
// 升序排序
ret = m1.invoke(((E)a), null).toString().compareTo(m2.invoke(((E)b), null).toString());
}
} catch (NoSuchMethodException ne) {
System.out.println(ne);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ret;
}
});
}
}
- 方法调用
public static void main(String[] args) {
ArrayList<A> list= new ArrayList<A>();
list.add(new A("语文",1));
list.add(new A("数学",2));
list.add(new A("英语",3));
ListSort<A> listSort= new ListSort<A>();
listSort.Sort(list, "getNum", "sort");
for(A a:list){
System.out.println(a.getName());
}
}
总结:按照以上执行(根据Num升序排序)出现顺序就是,语文,数学,英语。
注:这个方法之前在别的地方看过示例略有修改,出处忘了,标为原创,若原作者看到请告知。