关于排序
Guava的链式比较器
例子
assertTrue(byLengthOrdering.reverse().isOrdered(list));
梗概
Ordering是Guava的链式比较器类,可以被用作构造复杂的比较器,并应用到collection对象。
它的本质就仅仅是一个特殊的比较器实例。Ordering仅仅是执行一些依赖一个比较器的方法(譬如 Collections.max),并且把这些方法作为实例的的方法使用。Ordering类提供一些方法去调整和加强已经存在的比较器。
怎样创建一个Ordering
普通的orderings由下面的静态方法创建。
Method |
Description |
将能比较的对象按照自然顺序排序 |
|
使用toString()返回的字符串按字典顺序进行排序 |
|
使用一个已经存在的比较器 |
但是,去创建一个Ordering 更一般的方法是完全跳过Comparator,直接去继承一个Ordering抽象类。
链式比较
Ordering<String> byLengthOrdering = new Ordering<String>() {
public int compare(String left, String right) {
return Ints.compare(left.length(), right.length());
}
};
给予一个Ordering就能被包装,去获得派生的Orderings.下面是一些经常用到的变体方法。
Method |
Description |
返回一个顺序相反的Ordering. |
|
返回一个Ordering.,非空值优先输出,其余和最初的Ordering一样 |
|
当第一个比较器比较相等时使用第二个比较器。 |
|
Returns an Ordering that orders iterables lexicographically by their elements. 返回一个比较器,按照字典顺序遍历它的元素 |
|
返回一个比较器,它将函数应用到它的元素,然后按照最初的比较器将元素排序。 |
譬如,当你想要一个能将下面的类比较的比较器。。。
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,首先移动非空值到顶部,然后对他们的其余值进行排序。从后往前看是因为每一个链式调用都是包装前一个Ordering 成为一个新的Ordering 。
(从后向前看法则的特例:若是链条中有compound,从左向后读。为了避免迷惑,不要将包含 compound的调用和别的链式调用混合在一起。)
太长的链式不容易理解,我们建议像例子那样将链式限制在3个回调。即使如此,你仍可以像Function 的实例那样通过分割出中间对象来简化链式。
Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(sortKeyFunction);
关于应用
Guava提供许多方法去利用ordering 处理和检查值或者集合。我们在下面列出以下一些经常用到的。
Method |
Description |
See also |
Returns the k greatest elements of the specified iterable, according to this ordering, in order from greatest to least. Not necessarily stable. |
||
Tests if the specified Iterable is in nondecreasing order according to this ordering. |
||
Returns a sorted copy of the specified elements as a List. |
||
Returns the minimum of its two arguments according to this ordering. If the values compare as equal, the first argument is returned. |
||
Returns the minimum of its arguments according to this ordering. If there are multiple least values, the first is returned. |
||
Returns the minimum element of the specified Iterable. Throws a NoSuchElementException if theIterable is empty. |