歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java比較器的復用

設想這麼一種場景: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}

Copyright © Linux教程網 All Rights Reserved