java List Collections.sort 排序 支持 对象属性 普普通通数据类型 升序 降序 正序 倒序 排列

java List Collections.sort 排序 支持 对象属性 普通数据类型 升序 降序 正序 倒序 排列

import java.lang.reflect.Method;  
import java.text.SimpleDateFormat;  
import java.util.*;  
 
public class ListComparator implements Comparator {  
 
    public ListComparator() {}  
 
    public ListComparator(String methodName) {  
        this.methodName = methodName;  
    }  
 
    //空:普通的数据类型 非空:对象数据类型 取methodName返回值比较  
    String methodName;  
      
    public Object getValue(Object bean, String methodName) throws Exception {  
        Method getMethod = bean.getClass().getMethod(methodName, null);  
        return getMethod.invoke(bean, null);  
    }  
 
    public int compare(Object obj1, Object obj2) {  
        int val = -1;  
        try {  
            if ( methodName == null ) {  
                val = _compare(obj1, obj2);  
            } else {  
                val = _compare(getValue(obj1, methodName), getValue(obj2, methodName));  
            }  
        } 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;  
    }  
 
}  
 
//测试类  
class Test {  
    Long id;  
    public Long getId() {  
        return id;  
    }  
    public void setId(Long id) {  
        this.id = id;  
    }  
 
    public static void main(String[] args) {  
 
        //普通数据类型  升序  
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");  
        List list = new ArrayList();  
        for (long i = 0; i < 5; i++) {  
            list.add( new Date(System.currentTimeMillis() + (int) (Math.random() *

1000000000)) );  
        }  
 
        ListComparator c = new ListComparator();  
        Collections.sort(list, c);  
 
        for (int i = 0; i < list.size(); i++) {  
            System.out.println(simpleDateFormat.format(list.get(i)));  
        }  
 
         //对象数据类型 降序  
        List<Test> userList = new ArrayList();  
        Test test = new Test();  
        test.setId(null);  
        userList.add(test);  
 
        for (long i = 0; i < 5; i++) {  
            test = new Test();  
            test.setId(i);  
            userList.add(test);  
        }  
 
        c = new ListComparator("getId");  
        Collections.sort(userList,Collections.reverseOrder(c));  
          
        for (int i = 0; i < userList.size(); i++) {  
            System.out.println(userList.get(i).getId());  
        }  
 
    }