java比较器的复用
2014-12-04 23:20
429 查看
博客主页: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都可以当做是以往就使用的排序器
测试结果:
排序前: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}
设想这么一种场景: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}
相关文章推荐
- Java 可复用的面向对象的设计模式之 工厂模式Factory详解 :简单工厂模式 工厂方法模式 抽象工厂模式
- 【学习笔记】Thinking in java (第三版)第六章 Reusing Classes(复用类)
- 站稳马步——(3)java比较器——Comparable和Comparator
- java常用类库续3(比较器Comparable、Comparator、观察者设计模式、正则表达式、定时调度)
- java编程思想阅读笔记(二)访问权限控制和复用类
- JAVA对象比较器Comparator
- java 复用代码(组合与继承)
- java中比较器在结构体中的简单使用
- java 比较器
- 在JAVA中实现C++代码的复用
- JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)
- Java比较器对数组,集合排序一
- 在JAVA中实现C++代码的复用
- java 比较器的使用
- thingking in java 读书笔记---复用和多态
- java 自定义和使用比较器
- java思想之复用类 chapter 6
- Java.关于IO代码复用
- "Java中可复用事件处理的设计与实现"代码
- JAVA_两种比较器的实现