Guava 的 Ordering 可以说是更加强大的Java comparator, Ordering本身就是一个继承于Comparator的接口, 但是它还支持一些基于Comparator的操作例如 reverse, max, min, 它甚至还可以通过不同Ordering之间的组合或者链接(用Decorate的模式)完成更加强大的排序功能。


创建

有四种比较常见的(静态)创建方式

  1. nature()  用对象本身的compareTo()方法来进行比较

  2. usingToString()  通过传入对象的toString() 方法得到一个String值,然后对string值进行 String.compareTo()进行比较

  3. 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());
 
}
};


改变比较顺序的操作

  1. reverse() 比较使用倒序。

  2. nullsFirst() 移动所有的null 对象至排序队列的开头

  3. nullsLast() 移动所有的null 对象至排序队列的队尾


Ordering 的组合

  1. Ordering ordering = Ordering.natural().nullsFirst();

    用这种方式组合的Ordering, 必须是从右边向左边执行, 例如上例比较的时候是先把所有的NULL 值移动到开头, 然后在对那些非NULL的对象用nature()方式排序。


 2. compound

     Ordering 本身提供了一个compound方法来对两个不同的可以是自定义的Ordering进行组合操作,例如

     我们定义了两个Ordering 实例, 一个用来按照城市人口级别来排序的,一个是按照城市大小级别来排序的。  Ordering.from(cityByPopulation).compound(cityBySize); 那么这个新的组合的Ordering会先根据人口级别排序, 对于那些人口级别相同的城市,再会按照城市大小级别排序。 这种方式是从左向右执行的。  所以Google建议在使用第一种方式组合的时候最好不要使用第二种方式。 


其他有用的方法

  1. List greatestOf(Iterable iterable, int k)  找出给定集合中,按照Ordering排序最大的N个值。 对应的还有leastOf方法

  2. isOrdered(Iterable) 判断给定集合是后按当前制定Ordering排序的

  3. sortedCopy(Iterable) 返回给定集合的排序集合版本(ArrayList)

  4. min(E, E, E....), max(E,E,E...)  在给定的对象中找出当前指定Ordering的值小的或者值大的对象

  5. min(Iterator), max(Iterator)  在给定集合中找出当前指定Ordering的值小的或者值大的对象