设为首页 加入收藏

TOP

Java比较器的复用
2015-02-02 14:15:56 来源: 作者: 【 】 浏览:9
Tags: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 data = Lists.newArrayList(3, 1, 3, 1, 3, 2, 4, 2, 2, 2, 2, 4, 4, 2, 3, 1, 3, 4, 1, 2);
? ? ? ? List 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
() {
? ? ? ? ? ? @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
() {
? ? ? ? ? ? @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}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Yii CGridView 基本使用 下一篇C/C++的参数传递机制

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: