[Guava官方文档翻译] 4. 使用Guava Ordering排序 (Ordering Explained)
本文地址:http://www.cnblogs.com/hamhog/p/3537233.html
示例
assertTrue(byLengthOrdering.reverse().isOrdered(list));
概述
Ordering 是Guava的"流畅版" Comparator ,它用来构建高级comparator,并把comparator应用于各种集合(collection)。
本质上, Ordering 实例不过是一个特殊的 Comparator 实例。 Ordering 所做的就是把那些依赖于 Comparator 的方法(例如, Collections.max) 改写为成员方法。另外, Ordering 类提供一些可链式调用的方法,用来调整和增强已有的comparator。
创建Ordering
Ordering对象一般由以下静态方法创建:
方法 | 描述 |
natural() | 在Comparable类型上应用自然排序(natural ordering)。 |
usingToString() | 将对象的toString()返回值按字典序排序。 |
想要将已有的 Comparator 转化为 Ordering ,只需使用 Ordering.from(Comparator) 。
但是创建 Ordering 更常规的做法是完全忽略 Comparator ,直接扩展 Ordering 抽象类:
Ordering<String> byLengthOrdering = new Ordering<String>(){ public int compare(String left,String right){ return Ints.compare(left.length(), right.length()); } };
链式调用
可以通过包装 Ordering 来进行一些预处理。一些最常见的处理如下:
方法 | 描述 |
reverse() | 返回逆序的Ordering。 |
nullsFirst() | 返回的 Ordering 将null元素排在非null元素前面,其余部分的排序规则与原始的 Ordering 相同。nullsLast()同理。 |
compound(Comparator) | 返回的 Ordering 对之前每组相等的元素用指定的 Comparator 再排序。 |
lexicographical() | 返回的 Ordering 对iterable的元素按字典序排序。 |
onResultOf(Function) | 返回的 Ordering 将被排序的元素传入function,对返回值用原始的 Ordering排序。 |
举例来说,假设你希望创建下面这个类的 comparator ...
classFoo{ @NullableString sortedBy; int notSortedBy; }
...并且希望它能在 sortedBy 基础上处理null值。下面是应用链式调用的解决方案:
Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(newFunction<Foo,String>(){ public String apply(Foo foo){ return foo.sortedBy; } });
看 Ordering 的链式调用代码,要从右往左“倒序”看。上面这个例子将 Foo 类型的对象按它们 sortedBy 属性的值排序:首先把所有 sortedBy 属性为null的对象排到最前面,然后对其余对象按自然字符串序(natural string ordering)排序。之所以是这样倒序进行,是因为每次链式调用是把原先的 Ordering 包装在新的 Ordering 中。
(“倒序”规则有一个例外: 涉及 compound 的链式调用,应该从左往右看。为了避免混淆,不要把 compound 调用和其他链式调用混合处理。)
连续几次的链式调用可能不容易理解。我们建议把调用链的长度限制在3次调用之内,就像上面的例子这样。在这基础上,你还可以用 Function 等存储排序的中间结果,从而进一步简化代码。
Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(sortKeyFunction);
应用
Guava 提供了一些方法使用 Ordering 来处理、检查值和collection对象。我们列出最常用的如下:
方法 | 描述 | 同理可见 |
greatestOf(Iterable iterable, int k) | 根据ordering的排序规则,返回参数 iterable 的k个最大值。不稳定排序。 | leastOf |
isOrdered(Iterable) | 检查指定的 Iterable 根据ordering的排序规则是否有序(单调非减)。 | isStrictlyOrdered |
sortedCopy(Iterable) | 将指定元素的排序结果存入 List 返回。 |
immutableSortedCopy |
min(E, E) | 根据ordering的排序规则,返回两个参数中的较小者。如果两者相等,则返回第一个参数。 | max(E, E) |
min(E, E, E, E...) | 根据ordering的排序规则,返回两个参数中的较小者。如果有多个相等的最小值,则返回第一个。 |
max(E, E, E, E...) |
min(Iterable) | 返回参数 Iterable 最小值。如果这个 Iterable 是空的,则返回 NoSuchElementException 。 | max(Iterable), min(Iterator),max(Iterator) |
中文翻译自Guava官方文档:GuavaExplained - OrderingExplained 译者:戴仓薯