本文地址: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   译者:戴仓薯

[Guava官方文档翻译] 4. 使用Guava Ordering排序 (Ordering Explained)的更多相关文章

  1. [Guava官方文档翻译] 6. 用Guava辅助Throwable异常处理 (Throwables Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537508.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  2. [Guava官方文档翻译] 7. Guava的Immutable Collection(不可变集合)工具 (Immutable Collections Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3538666.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  3. [Guava官方文档翻译] 5. Guava的Object公共方法 (Common Object Utilities Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537367.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  4. [Guava官方文档翻译] 2.使用和避免使用null (Using And Avoiding Null Explained)

    本文地址:http://www.cnblogs.com/hamhog/p/3536647.html "null很恶心." -Doug Lea "这是一个令我追悔莫及的错误 ...

  5. [Guava官方文档翻译] 1.Guava简介 (Introduction)

    用户指南 Guava包含Google在Java项目中用到的一些核心库:collections, caching, primitives support, concurrency 库, common a ...

  6. [Guava官方文档翻译] 3. 前置条件检查(Preconditions Explained)

    本文地址:http://www.cnblogs.com/hamhog/p/3536964.html 前置条件检查 Guava提供了一些检查前置条件的utilities.我们强烈建议静态import这些 ...

  7. Guava ---- Ordering排序工具

    使用Guava的排序工具类, 高速实现对象的单变量排序和多变量排序, 让你的开发效率爆炸... import com.google.common.collect.Lists; import com.g ...

  8. Google Guava官方教程(中文版)

    Google Guava官方教程(中文版) 原文链接  译文链接 译者: 沈义扬,罗立树,何一昕,武祖  校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库, ...

  9. [转]Google Guava官方教程(中文版)

    Google Guava官方教程(中文版) http://ifeve.com/google-guava/

随机推荐

  1. 解决ecshop在线客户点击无法唤醒QQ问题

    找到default/library/page_footer.lbi中找到QQ代码的相应位置,然后你会发现之前模板里面为什么QQ点击不能对话,是因为QQ客服安装包中的JS代码有的可能是比较旧的代码了. ...

  2. JavaScript要点 (三) 保留关键字

    在 JavaScript 中,一些标识符是保留关键字,不能用作变量名或函数名. JavaScript 标准 所有的现代浏览器完全支持 ECMAScript 3(ES3,JavaScript 的第三版, ...

  3. 原生js操作cookie

    写cookie function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.getTim ...

  4. DRM你又赢了:其API纳入HTML5标准

    摘要:W3C今天发布了一份加密媒体扩展工作草案(EME),将支持DRM多媒体数字内容,而且浏览器将无需使用Flash或Silverlight.EME定义了一系列API,允许JavaScript和HTM ...

  5. 序列化与反序列化Serialize&Deserialize

    序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串“2”表示.如果有个对象,叫做connter, ...

  6. Codeforces Round #324 (Div. 2) A. Olesya and Rodion 水题

    A. Olesya and Rodion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/584/p ...

  7. 一个Solr搜索实例,增删改查+高亮+分页

    今天个人coding的模块测试,所以闲暇之余继续研究solr,然后顺带写了一个实例,随便搞的,solr真心不熟,期待认识热爱搜索的朋友,共同进步. 1.配置schema.xml文件[solr\coll ...

  8. IOS - 常用宏定义和功能方法

    可能不定期添加新的东西 github地址:https://github.com/yuqingzhude/CommonUseDemo /************************Tools**** ...

  9. Web.xml 中增加log4j

    配置文件例如以下.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...

  10. VMware:虚拟机磁盘空间不足怎么办

    前言: 虚拟机里一般我们用的虚拟磁盘,在电脑上是一个或多个文件,随着软件和数据的增多,有时也会提示磁盘空间不足. 那么,虚拟机磁盘空间不足如何处理呢?   一:调整磁盘分区大小; 若只是提示相应磁盘分 ...