本文地址: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. 微软.NET各子技术领域的应用前景

    从2002年微软发布.NET 1.0,其间历经了8年的发展,再到.NET 4.0,其已经成为一个庞大而复杂的软件开发与运行平台,架构日益复杂,应用领域也在不断地扩展,包容了“一堆”的子技术领域. 在. ...

  2. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  3. xcode中create groups 和 create folder reference 的区别

    (文章为博主原创,未经允许,不得转载!) 今天在项目中搭建框架忽然发现工程中有黄蓝文件夹的区别,而且对应到不同的情况: 1.蓝色文件夹下文件不能被读取: 2.蓝色文件夹下创建新的文件类会直接跳过选择类 ...

  4. 金蝶K3 破解版

  5. 访谈将源代码的函数 strcpy/memcpy/atoi/kmp/quicksort

    一.社论 继上一次发表了一片关于參加秋招的学弟学妹们怎样准备找工作的博客之后,反响非常大.顾在此整理一下,以便大家复习.好多源自july的这篇博客,也有非常多是我自己整理的.希望大家可以一遍一遍的写. ...

  6. java_Cookie添加和删除

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...

  7. springMVC学习笔记三

    十三.springMVC和spring集成 配置文件,spring的配置路径applicationContext.xml 在默认的web-inf下面 strut的配置文件默认在src下面 用了什么框架 ...

  8. UTF-8编码与Unicode CS2的转换

    /* Convert a UTF-8 string into a UCS-2 array. */ void tcstrutftoucs(const char *str, uint16_t *ary, ...

  9. Android 自学之进度条ProgressBar

    进度条(ProgressBar)也是UI界面中的一种非常使用的组件,通常用于向用户显示某个耗时完成的百分比.因此进度条可以动态的显示进度,因此避免长时间地执行某个耗时操作时,让用户感觉程序失去了响应, ...

  10. linux命令 --> pwd命令

    关于 pwd 命名前面在cd命令中已经出现过啦!!不过还是简单的说一下吧! pwd命令简单的介绍: pwd - print name of current/working directory(这... ...