关于排序

Guava的链式比较器

例子

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

梗概

Ordering是Guava的链式比较器类,可以被用作构造复杂的比较器,并应用到collection对象。

它的本质就仅仅是一个特殊的比较器实例。Ordering仅仅是执行一些依赖一个比较器的方法(譬如 Collections.max),并且把这些方法作为实例的的方法使用。Ordering类提供一些方法去调整和加强已经存在的比较器。

怎样创建一个Ordering

普通的orderings由下面的静态方法创建。

Method

Description

natural()

将能比较的对象按照自然顺序排序

usingToString()

使用toString()返回的字符串按字典顺序进行排序

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就能被包装,去获得派生的Orderings.下面是一些经常用到的变体方法。

Method

Description

reverse()

返回一个顺序相反的Ordering.

nullsFirst()

返回一个Ordering.,非空值优先输出,其余和最初的Ordering一样

compound(Comparator)

当第一个比较器比较相等时使用第二个比较器。

lexicographical()

Returns an Ordering that orders iterables lexicographically by their elements.

返回一个比较器,按照字典顺序遍历它的元素

onResultOf(Function)

返回一个比较器,它将函数应用到它的元素,然后按照最初的比较器将元素排序。

譬如,当你想要一个能将下面的类比较的比较器。。。

 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

greatestOf(Iterable iterable, int k)

Returns the k greatest elements of the specified iterable, according to this ordering, in order from greatest to least. Not necessarily stable.

leastOf

isOrdered(Iterable)

Tests if the specified Iterable is in nondecreasing order according to this ordering.

isStrictlyOrdered

sortedCopy(Iterable)

Returns a sorted copy of the specified elements as a List.

immutableSortedCopy

min(E, E)

Returns the minimum of its two arguments according to this ordering. If the values compare as equal, the first argument is returned.

max(E, E)

min(E, E, E, E...)

Returns the minimum of its arguments according to this ordering. If there are multiple least values, the first is returned.

max(E, E, E, E...)

min(Iterable)

Returns the minimum element of the specified Iterable. Throws a NoSuchElementException if theIterable is empty.

max(Iterable)min(Iterator),max(Iterator)

[技术翻译]Guava官方文档Ordering的更多相关文章

  1. 我为什么要翻译ES6官方文档

    ES6出来很久了,现在网上也有很多教程,其中以阮一峰老师的教程最为经典.大家通过学习阮老师的教程肯定能学懂ES6最新的技术. ES6官方文档是一个规范,各浏览器在实现ES6的具体API时都会遵循它.我 ...

  2. 为开源社区尽一份力,翻译RocketMQ官方文档

    正如在上一篇文章中写道:"据我所知,现在RocketMQ还没有中文文档.我打算自己试着在github上开一个项目,自行翻译."我这几天抽空翻译了文档的前3个小节,发现翻译真的不是一 ...

  3. Apache Flume入门指南[翻译自官方文档]

    声明: 根据官方文档选择性的翻译了下,不对请指正 https://flume.apache.org/FlumeUserGuide.html

  4. 自己翻译 delegation 官方文档

    什么是代理,知道怎么用,见过N次.会用代理传值,还不够.代理到底是用来干嘛的嘛?还是看看官方文档吧,自己翻译出来看看是不是通顺 代理: 代理是一个简单高效的模式,尤其是一个类在编程的过程中代表或者需要 ...

  5. [翻译]PyMongo官方文档

    PyMongo官方文档翻译 周煦辰 2016-06-30 这是本人翻译的PyMongo官方文档.现在网上分(抄)享(袭)的PyMongo博客文章很多,一方面这些文章本就是抄袭的,谈不上什么格式美观,另 ...

  6. [翻译]Android官方文档 - 通知(Notifications)

    翻译的好辛苦,有些地方也不太理解什么意思,如果有误,还请大神指正. 官方文档地址:http://developer.android.com/guide/topics/ui/notifiers/noti ...

  7. Android Support Library 23.2介绍(翻译自官方文档)

    Android Support Library 23.2 (译者注:本文标注了部分文字链接,但须要***,要查看全部链接.请查看sukey=014c68f407f2d3e181b6b5e665f26a ...

  8. 【Android开发】Android Host详解(翻译自官方文档)

    原文:http://android.eoe.cn/topic/summary 文档内容 API概述 Android中manifest文件需求 工作的设备 * 发现设备 * 获得和设备进行“交流”的权限 ...

  9. Guava官方文档-RateLimiter类

    转载自并发编程网 – ifeve.com RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证.如果必要的话,每个acquire() 会阻塞当前线程直到许可证可用后获取该许可证 ...

随机推荐

  1. Hibernate如何一个类映射两个表

    一个User类有username,password属性,还有 otherInformation等其他属性,username和password映射到一个表,otherInformation等其他属性映射 ...

  2. codeforce-191E-Thwarting Demonstrations(树状数组+二分+离散)

    题意: 求第K 大连续区间 分析: 二分答案,再n * log(n)判断有几个区间的区间和大于mid,然后调整上下界,使这个值不断的接近k. 判断符合条件的区间总数:线性扫描sum[n](前n项和) ...

  3. Delphi WEB APP DEBUGGER是如何使用的

      WEB APP DEBUGGER是怎么使用的最近在写一个WEBSERVICE的程序,怎么设置使用,WEBAPPDEBUGGER这个工具呢,让别人在调用我的WEBSERVICE的时候我可以调试的?谢 ...

  4. 2012 A 《中国近现代史纲要》课程期末考试试卷

    湖南人文科技学院2012—2013学年第1学期公共课 2011级<中国近现代史纲要>课程期末考试试卷 考核方式:(开卷)                                   ...

  5. JAVA工程师面试总结

    HR面: 你为什么要离职?如果是公司层面的,公司为什么要这么做? 你的理想薪资?你觉得你有什么优势胜任你应聘的工作? 你的未来发展规划? BOSS面: 项目的东西,hibernate调优?使用了什么数 ...

  6. OpenStack简单测试性能监控数据记录

  7. Servlet的一些细节(2)

    1. Servlet的创建时间 Servlet是不能单独运行,调用它的叫做Servlet引擎,或者叫做web服务器 针对客户端的多长Servlet请求,通常情况下,服务器只会创建一个Servlet实例 ...

  8. centos安装GO

    1,下载 go1.5.1.linux-amd64.tar.gz 2,将go解压到/opt,个人喜好罢了[root@localhost ~]# tar -C /opt -xzf ./go1.5.1.li ...

  9. angular2的管道初体验

    ng管道是应用里面比较重要的一个技术,他涉及很多功能 包括排序过滤 废话不说 直接上代码 新建个文件夹吧这个samplepipe.ts放进去 然后 你要做什么 在里面写管道代码 然后在app.modu ...

  10. HTML5新特性之Canvas+drag(拖拽图像实现图像反转)

    1.什么是canvas 在网页上使用canvas元素时,会创建一块矩形区域,默认矩形区域宽度300px,高度150px.. 页面中加入canvas元素后,可以通过javascript自由控制.可以在其 ...