本文地址: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. 【UML】——为什么要使用UML

    以前一提到UML,就想到了复杂的流程图.很敬佩哪些想想就能画出整个系统的UML图的人,因为他们头脑中有整个软件架构的蓝图,这样在编写实现的时候,就会知道哪个地方改怎么做,哪个地方如何扩展. 而想成为架 ...

  2. Android 如何添加一种锁屏方式

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  3. VMWare9下基于Ubuntu12.10搭建Hadoop-1.2.1集群

    VMWare9下基于Ubuntu12.10搭建Hadoop-1.2.1集群 下一篇:VMWare9下基于Ubuntu12.10搭建Hadoop-1.2.1集群-整合Zookeeper和Hbase 近期 ...

  4. 《Maven_孔浩》Maven命令

    maven命令: mvn compile:maven编译 mvn test:测试 mvn clean:删除编译生成的target文件 mvn package:运行编译.测试.package,把项目打包 ...

  5. 分享SVN的钩子代码[借鉴学习]pre-commit-post 钩子

      #/bin/bash REPOS=$1 TXN=$2 export HOME=/ export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/us ...

  6. java_spring_bean的作用域_实例是否为单实例

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. Java_生产者消费者模式

    /* * To change this license header, choose License Headers in Project Properties. * To change this t ...

  8. linux剪切拷贝

    1.剪切 mv rename.sh  ../rename.sh  把这个文件移到上一级目录下 mv rename.sh ./pic/rename.sh 把这个文件移到 当前目录下的pic目录下,并改名 ...

  9. Java设计模式06:常用设计模式之适配器模式(结构型模式)

    1. Java之适配器模式(Adapter Pattern) (1)概述:    将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类,可以在一起 ...

  10. Android开发环境搭建完全图解(转)

    本文介绍从0开始,在Linux系统下,搭建一个Android开发环境的方法. 如果你是<Learning Android>这本书的读者,你也可以参考这篇文章,因为这篇文章是以书中的安装方法 ...