Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法

package xxxx;

import xxxx;
import xxxx;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

public class MySortList<E> {

    /**
     * 对列表中的数据按指定字段进行排序。要求类必须有相关的方法返回字符串、整型、日期等值以进行比较。
     * @param list
     * @param method
     * @param reverseFlag
     */
    public void sortByMethod(List<E> list, final String method,
                             final boolean reverseFlag) {
        Collections.sort(list, new Comparator<Object>() {
            @SuppressWarnings("unchecked")
            public int compare(Object arg1, Object arg2) {
                int result = 0;
                try {
                    Method m1 = ((E) arg1).getClass().getMethod(method, null);
                    Method m2 = ((E) arg2).getClass().getMethod(method, null);
                    Object obj1 = m1.invoke(((E)arg1), null);
                    Object obj2 = m2.invoke(((E)arg2), null);
                    if(obj1 instanceof String) {
                        // 字符串
                        result = obj1.toString().compareTo(obj2.toString());
                    }else if(obj1 instanceof Date) {
                        // 日期
                        long l = ((Date)obj1).getTime() - ((Date)obj2).getTime();
                        if(l > 0) {
                            result = 1;
                        }else if(l < 0) {
                            result = -1;
                        }else {
                            result = 0;
                        }
                    }else if(obj1 instanceof Integer) {
                        // 整型(Method的返回参数可以是int的,因为JDK1.5之后,Integer与int可以自动转换了)
                        result = (Integer)obj1 - (Integer)obj2;
                    }else {
                        // 目前尚不支持的对象,直接转换为String,然后比较,后果未知
                        result = obj1.toString().compareTo(obj2.toString());

                        System.err.println("MySortList.sortByMethod方法接受到不可识别的对象类型,转换为字符串后比较返回...");
                    }

                    if (reverseFlag) {
                        // 倒序
                        result = -result;
                    }
                } catch (NoSuchMethodException nsme) {
                    nsme.printStackTrace();
                } catch (IllegalAccessException iae) {
                    iae.printStackTrace();
                } catch (InvocationTargetException ite) {
                    ite.printStackTrace();
                }

                return result;
            }
        });
    }


    // 测试函数
    public static void main(String[] args) throws Exception {

        List<SkyDevOrg> skyDevOrgList = new ArrayList<>();
        SkyDevOrg skydevUser1 = new SkyDevOrg();

        skydevUser1.setCode("B0100007");
        skydevUser1.setName("公司10");
        SkyDevOrg skydevUser2 = new SkyDevOrg();
        skydevUser2.setCode("B0100008");
        skydevUser2.setName("公司8");

        SkyDevOrg skydevUser3 = new SkyDevOrg();
        skydevUser3.setCode("B0100006");
        skydevUser3.setName("公司3");

        SkyDevOrg skydevUser4 = new SkyDevOrg();
        skydevUser4.setCode("B0100005");
        skydevUser4.setName("公司4");

        SkyDevOrg skydevUser5 = new SkyDevOrg();
        skydevUser5.setCode("B0100004");
        skydevUser5.setName("公司1");

        SkyDevOrg skydevUser6 = new SkyDevOrg();
        skydevUser6.setCode("B0100003");
        skydevUser6.setName("公司2");

        skyDevOrgList.add(skydevUser1);
        skyDevOrgList.add(skydevUser2);
        skyDevOrgList.add(skydevUser3);
        skyDevOrgList.add(skydevUser4);
        skyDevOrgList.add(skydevUser5);
        skyDevOrgList.add(skydevUser6);




        // 方式二排序输出
        MySortList<SkyDevOrg> msList = new MySortList<SkyDevOrg>();
        msList.sortByMethod(skyDevOrgList, "getCode", false);
        for(SkyDevOrg skyDevOrg:skyDevOrgList){
            System.out.println(skyDevOrg.getCode()+","+skyDevOrg.getName());
        }

    }
}

你可能感兴趣的:(Java,基础,java集合排序,集合中属性排序,集合对象字段排序)