Guava学习之Basic Utilities ——Ordering

Ordering

Example

assertTrue(byLengthOrdering.reverse().isOrdered(list));

Overview

Ordering 是Guava's "fluent" Comparator 类, 它能够被用来建立复杂的比较器并应用于集合中。

其核心的Ordering实例其实就是一个特殊的 Comparator实例. Ordering 将方法简单的依赖于一个 Comparator (例如, Collections.max) 并使它们作为实例方法可用。不同的是, Ordering类提供链式方法来调整和增强现有的比较器。

Creation

普通的orderings由静态方法提供:

MethodDescription
natural()比较器类型是自然排序
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()); } };

Chaining

一个给定的Ordering 可以被包装以获得派生的Ordering 。一些最常用的变体包括:

MethodDescription
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。我们将其中用的最多的列举出来:

MethodDescriptionSee 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 为空,抛出NoSuchElementExceptionmax(Iterable), min(Iterator), max(Iterator)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值