java 对象 list 万能排序方法

本文针对 java 开发过程中经常遇到的一个问题——对 list 数据进行排序,进行讨论,并开发了一个万能排序方法,供大家参考讨论。

list 排序普通做法

重载 Comparator 类

代码如下:

        List list = new ArrayList();
        //......
        Collections.sort(list, new MyComparator());
        class MyComparator implements Comparator
        {
            //这里的o1和o2就是list里任意的两个对象,然后按需求把这个方法填完整就行了
            public int compare(Object o1, Object o2)
            {
                //比较规则
            }
        }

这种方法实现比较容易,但是针对不同对象的列表都需要重载方法,会显得代码比较臃肿。

网上的一种万能方法

参考链接:http://blog.csdn.net/5iasp/article/details/17717179
此链接中提供了一种能实现所有对象列表的排序方法,但是依然存在如下问题:
1.用到了泛型,而且实现相对复杂;
2.扩展性并不是很好。

万能排序方法

针对实际需求和网上现有方法存在的问题,利用 java.lang.reflect.Field 开发了万能排序方法。

实体类

public class TestBean {
    private Integer intVar;
    private String stringVar;
    private Boolean booleanVar;

    public Integer getIntVar() {
        return intVar;
    }

    public void setIntVar(Integer intVar) {
        this.intVar = intVar;
    }

    public String getStringVar() {
        return stringVar;
    }

    public void setStringVar(String stringVar) {
        this.stringVar = stringVar;
    }

    public Boolean getBooleanVar() {
        return booleanVar;
    }

    public void setBooleanVar(Boolean booleanVar) {
        this.booleanVar = booleanVar;
    }
}

排序类

class ComparatorList implements Comparator {
    private String proName;
    private String proType = "string";

    public ComparatorList(String proName){
        this.proName = proName;
    }

    public ComparatorList(String proName, String proType){
        this.proName = proName;
        this.proType = proType;
    }

    public int compare(Object obj0, Object obj1) {
        Object value0 = getFieldValueByName(obj0);
        Object value1 = getFieldValueByName(obj1);

        if(value0 != null && value1 != null){
            if(this.proType.equals("string")){
                return (value0.toString().toLowerCase()).compareTo(value1.toString().toLowerCase());
            }
            //此处可根据不同条件进行扩展,比如整数int,或者ip规则等。
        }
        return 0;
    }

    public Object getFieldValueByName(Object obj){
        try {
            Field field = obj.getClass().getDeclaredField(this.proName);
            field.setAccessible(true);
            return field.get(obj);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return null;
    }
}

测试程序

    public static void test(){
        List<TestBean> testBeanList = new ArrayList<TestBean>();
        TestBean testBean = new TestBean();
        testBean.setStringVar("444");
        testBeanList.add(testBean);

        testBean = new TestBean();
        testBean.setStringVar("gggg");
        testBeanList.add(testBean);

        testBean = new TestBean();
        testBean.setStringVar("hddg");
        testBeanList.add(testBean);

        testBean = new TestBean();
        testBean.setStringVar("53ddd");
        testBeanList.add(testBean);

        testBean = new TestBean();
        testBean.setStringVar("3dfs");
        testBeanList.add(testBean);
        for(TestBean portService1:testBeanList){
            System.out.println("---"+portService1.getStringVar());
        }

        ComparatorList comparatorList = new ComparatorList("stringVar","string");
        Collections.sort(testBeanList,comparatorList);
        Collections.reverse(testBeanList);
        for(TestBean portService1:testBeanList){
            System.out.println("***"+portService1.getStringVar());
        }
    }

测试结果

---444
---gggg
---hddg
---53ddd
---3dfs
***hddg
***gggg
***53ddd
***444
***3dfs

==========================================
疑问?帮助?批评?欢迎评论 | QQ:593159978

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值