Guava 的 Ordering 可以说是更加强大的Java comparator, Ordering本身就是一个继承于Comparator的接口, 但是它还支持一些基于Comparator的操作例如 reverse, max, min, 它甚至还可以通过不同Ordering之间的组合或者链接(用Decorate的模式)完成更加强大的排序功能。
创建
有四种比较常见的(静态)创建方式
nature() 用对象本身的compareTo()方法来进行比较
usingToString() 通过传入对象的toString() 方法得到一个String值,然后对string值进行 String.compareTo()进行比较
from(Comparator) 直接从现有的Comparator 得到Ordering 对象
4. 通过自定义的方式:
Ordering<String> byLengthOrdering = new Ordering<String>() {
public int compare(String left, String right) {
return Ints.compare(left.length(), right.length());
}
};
改变比较顺序的操作
reverse() 比较使用倒序。
nullsFirst() 移动所有的null 对象至排序队列的开头
nullsLast() 移动所有的null 对象至排序队列的队尾
Ordering 的组合
Ordering<Foo> ordering = Ordering.natural().nullsFirst();
用这种方式组合的Ordering, 必须是从右边向左边执行, 例如上例比较的时候是先把所有的NULL 值移动到开头, 然后在对那些非NULL的对象用nature()方式排序。
2. compound
Ordering 本身提供了一个compound方法来对两个不同的可以是自定义的Ordering进行组合操作,例如
我们定义了两个Ordering 实例, 一个用来按照城市人口级别来排序的,一个是按照城市大小级别来排序的。 Ordering.from(cityByPopulation).compound(cityBySize); 那么这个新的组合的Ordering会先根据人口级别排序, 对于那些人口级别相同的城市,再会按照城市大小级别排序。 这种方式是从左向右执行的。 所以Google建议在使用第一种方式组合的时候最好不要使用第二种方式。
其他有用的方法
List<E> greatestOf(Iterable<E> iterable, int k) 找出给定集合中,按照Ordering排序最大的N个值。 对应的还有leastOf方法
isOrdered(Iterable) 判断给定集合是后按当前制定Ordering排序的
sortedCopy(Iterable) 返回给定集合的排序集合版本(ArrayList)
min(E, E, E....), max(E,E,E...) 在给定的对象中找出当前指定Ordering的值小的或者值大的对象
min(Iterator), max(Iterator) 在给定集合中找出当前指定Ordering的值小的或者值大的对象
Guava学习总结之- 3 - Basic Utilities - Ordering
原文地址:http://545979.blog.51cto.com/535979/1545924