java比较器的复用

博客主页:http://blog.csdn.net/minna_d

设想这么一种场景:A有N个字段,也有专门对A的比较函数。每一次比较函数,在N多个业务线复用。

那么,问题来了, 突然有一天A多加了一个字段in,而且在原一特定场景中这个字段比其它所有字段的优先级都应该高。在其它场景中又没有影响。

该怎么解决这个问题?


1. 重写原有的所有的Comparator类,重写它们的compare方法。这种方法代价太大,因为N多地方需要 if...else

2. 只正对特定场景新增一个组合之前的comparator的方法。

如果有一种Collections.sort(aList, Lists.newArraryList(c1, c2, c3))这样的数据结构,那么问题就迎刃而解了(其实自己写一个也很简单)。

不过没有找到,无意之中在apache.commons.collections 找到了一个可以完全替代他的类。ComparatorChain,内部也是用一个链表保存所有排序器


C1、C2都可以当做是以往就使用的排序器

    static class A {

        Integer n1;
        Integer n2;

        A(Integer n1, Integer n2) {
            this.n1 = n1;
            this.n2 = n2;
        }

        @Override
        public String toString() {
            return "A{" + "n1=" + n1 + ", n2=" + n2 + '}';
        }
    }

    public static void main(String[] args) {

        List<Integer> data = Lists.newArrayList(3, 1, 3, 1, 3, 2, 4, 2, 2, 2, 2, 4, 4, 2, 3, 1, 3, 4, 1, 2);
        List<A> aList = Lists.newArrayList();
        for (Integer i = 0; i < data.size(); i += 2) {
            aList.add(new A(data.get(i), data.get(i + 1)));
        }

        ComparatorChain multiSort = new ComparatorChain();
        multiSort.addComparator(new Comparator<A>() {
            @Override
            public int compare(A o1, A o2) {
                return Integer.compare(o1.n1, o2.n1);
            }

            @Override
            public boolean equals(Object obj) {
                return false;
            }
        });
        multiSort.addComparator(new Comparator<A>() {
            @Override
            public int compare(A o1, A o2) {
                return Integer.compare(o1.n2, o2.n2);
            }

            @Override
            public boolean equals(Object obj) {
                return false;
            }
        });

        System.out.println("排序前:" + Joiner.on(",").join(aList));
        Collections.sort(aList, multiSort);
        System.out.println("排序后:" + Joiner.on(",").join(aList));

    }


测试结果:

排序前:A{n1=3, n2=1},A{n1=3, n2=1},A{n1=3, n2=2},A{n1=4, n2=2},A{n1=2, n2=2},A{n1=2, n2=4},A{n1=4, n2=2},A{n1=3, n2=1},A{n1=3, n2=4},A{n1=1, n2=2}
排序后:A{n1=1, n2=2},A{n1=2, n2=2},A{n1=2, n2=4},A{n1=3, n2=1},A{n1=3, n2=1},A{n1=3, n2=1},A{n1=3, n2=2},A{n1=3, n2=4},A{n1=4, n2=2},A{n1=4, n2=2}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值