Ordering
Example
assertTrue(byLengthOrdering.reverse().isOrdered(list));
Overview
Ordering 是Guava's "fluent" Comparator 类, 它能够被用来建立复杂的比较器并应用于集合中。
其核心的Ordering实例其实就是一个特殊的 Comparator实例. Ordering 将方法简单的依赖于一个 Comparator (例如, Collections.max) 并使它们作为实例方法可用。不同的是, Ordering类提供链式方法来调整和增强现有的比较器。
Creation
普通的orderings由静态方法提供:
Method | Description |
natural() | 比较器类型是自然排序 |
usingToString() | 按照字符串进行字典排序,并返回toString() |
将一个以及存在的 Comparator的使用变成 Ordering 一样简单
更加普遍的一种方法是创建自定义Ordering 的办法是跳过Comparator 直接继承抽象 Ordering 类:
Ordering<String> byLengthOrdering = new Ordering<String>() { public int compare(String left, String right) { return Ints.compare(left.length(), right.length()); } };
Chaining
一个给定的Ordering 可以被包装以获得派生的Ordering 。一些最常用的变体包括:
Method | Description |
reverse() | 返回反转的Ordering |
nullsFirst() | 返回k空元素在非空元素之前排序,否则将与原始排序相同。也见nullsLast() |
compound(Comparator) | 返回一个使用特殊的Comparator进行"break ties"的Ordering |
lexicographical() | 返回一个按字典序排序的 Ordering |
onResultOf(Function) | 返回一个Ordering,通过将函数应用于它们,然后使用原始排序比较结果来排序值。 |
例如, 你想要为下面的class建立一个 comparator...
class Foo { @Nullable String sortedBy; int notSortedBy; }
...该比较器能够处理sortedBy为空的情况. 这是一个构建在链接方法之上的解决方案:
Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Foo, String>() { public String apply(Foo foo) { return foo.sortedBy; } });
阅读链式 Ordering访问时应该从右向左。上面的例子中,对Foo排序时首先查看sortedBy的值将null
值提前,然后再按照自然顺序排序。这种倒序出现是因为每个链接调用都是将先前的顺序封装成新的顺序。
( "backwards"规则的例外: 对于调用的复合链,从左向右读取。 这样做的目的是为了避免混淆,避免将复合调用与其他链式调用混合。)
链式调用太长会导致很难理解,我们建议最好能控制在三个以内。即使如此,你也可以通过分离中间对象(例如函数实例)来简化代码:
Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(sortKeyFunction);
Application
Guava 提供了许多方法来操作或检查值或集合来使用ordering。我们将其中用的最多的列举出来:
Method | Description | See also |
greatestOf(Iterable iterable, int k) | 返回指定iterable的K个最大值,从大到小排序,不稳定。 | leastOf |
isOrdered(Iterable) | 根据指定的顺序测试指定的Iterable 是否为非递减顺序。 | isStrictlyOrdered |
sortedCopy(Iterable) | 返回一个List元素有序的拷贝 | immutableSortedCopy |
min(E, E) | 根据排序规则返回最小的元素,如果值相等则返回第一个。 | max(E, E) |
min(E, E, E, E...) | 根据此顺序返回其参数的最小值。如果存在多个最小值,则返回第一个值。 | max(E, E, E, E...) |
min(Iterable) | 返回指定的Iterable的最小值。如果此Iterable 为空,抛出NoSuchElementException | max(Iterable), min(Iterator), max(Iterator) |