import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/*
Collections.sort(list,new ListComparator());
Collections.sort(list,Collections.reverseOrder(new ListComparator()));
*/
public class ListComparator implements Comparator {
public ListComparator() {
}
public ListComparator(String fieldName) {
this.fieldName = fieldName;
}
//空:普通的数据类型 非空:对象数据类型 取methodName返回值比较
String fieldName;
public Object getValue(Object bean) throws Exception {
try {
Field field = bean.getClass().getDeclaredField(fieldName);
return field.get(bean);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public int compare(Object obj1, Object obj2) {
int val = -1;
try {
if (fieldName == null) {
val = _compare(obj1, obj2);
} else {
val = _compare(getValue(obj1), getValue(obj2));
}
} catch (Exception ex) {
ex.printStackTrace();
}
return val;
}
public int _compare(Object obj1, Object obj2) throws Exception {
if (obj1 == null || obj2 == null) return obj1 == null ? -1 : 1;
Class cl = obj1.getClass();
if (obj1 instanceof java.lang.Comparable) {
//byte int long float..number, date , boolean , char
Method getMethod = obj1.getClass().getMethod("compareTo", new Class[]{cl});
return (Integer) getMethod.invoke(obj1, new Object[]{obj2});
}
return -1;
}
public static void main(String[] arge) {
//
List list = new ArrayList();
list.add(new Test(1));
list.add(new Test(2));
list.add(new Test(3));
list.add(new Test(4));
Collections.sort(list, Collections.reverseOrder(new ListComparator("id")));
System.out.println(list);
Collections.sort(list, new ListComparator("id"));
System.out.println(list);
list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Collections.sort(list, Collections.reverseOrder(new ListComparator()));
System.out.println(list);
Collections.sort(list, new ListComparator());
System.out.println(list);
}
}
class Test {
public Test(int id){
this.id = id;
}
public int id;
public String toString(){
return String.valueOf(id);
}
}