场景: 要对一个项目中所有List集合进行排序。如果按照往常的方法,估计要重写至少50次compare方法,因为需要排序的类不同,字段也不同,普通方法无法复用。
但经过思考发现,可以利用Java的泛型和反射封装一个通用的工具类实现对任意对象集合的任意字段进行正序和逆序排列,代码如下:
1.工具类
package utils;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* List集合排序工具类
*/
public class ListSortUtil<T> {
/**
* @param targetList
* 要排序的实体类List集合
* @param sortField
* 排序字段(实体类属性名)
* @param sortMode
* true正序,false逆序
*/
@SuppressWarnings(
"all")
public static <T>
void sort(List<T> targetList,
final String sortField,
final boolean sortMode) {
if(targetList==
null||targetList.size()<
2||sortField==
null||sortField.length()==
0){
return;
}
Collections.sort(targetList,
new Comparator() {
@Override
public int compare(Object obj1, Object obj2) {
int retVal =
0;
try {
String methodStr =
"get" + sortField.substring(
0,
1).toUpperCase() + sortField.substring(
1);
Method method1 = ((T) obj1).getClass().getMethod(methodStr,
null);
Method method2 = ((T) obj2).getClass().getMethod(methodStr,
null);
if (sortMode) {
retVal = method1.invoke(((T) obj1),
null).toString().compareTo(method2.invoke(((T) obj2),
null).toString());
}
else {
retVal = method2.invoke(((T) obj2),
null).toString().compareTo(method1.invoke(((T) obj1),
null).toString());
}
}
catch (Exception e) {
System.out.println(
"List<"+ ((T) obj1).getClass().getName() +
">排序异常!");
e.printStackTrace();
}
return retVal;
}
});
}
}
2.随便写个类用于排序测试
package test;
import java.util.Date;
public class Dog {
private String name;
private Date time;
public String
getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date
getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
@Override
public String
toString() {
return "Dog [name=" + name +
", time=" + time +
"]";
}
}
3.排序测试
package test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import utils.ListSortUtil;
public class ListSortMain {
public static void main(String[] args)
throws InterruptedException {
List<Dog> dogList =
new ArrayList<Dog>();
for (
int i =
0; i <
5; i++) {
Dog d =
new Dog();
d.setName(
"dog" + i);
d.setTime(
new Date());
dogList.add(d);
Thread.sleep(
1000);
}
System.out.println(
"排序前:" + dogList.toString());
ListSortUtil.sort(dogList,
"name",
true);
System.out.println(
"按name正序排:" + dogList.toString());
ListSortUtil.sort(dogList,
"name",
false);
System.out.println(
"按name逆序排:" + dogList.toString());
ListSortUtil.sort(dogList,
"time",
true);
System.out.println(
"按time正序排:" + dogList.toString());
ListSortUtil.sort(dogList,
"time",
false);
System.out.println(
"按time逆序排:" + dogList.toString());
}
}
参考文档
http://www.jianshu.com/p/bfee34759f99/