关于排序

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. 使用SetWindowPos API函数移动窗口后,还需修改Delphi的属性值,以备下次使用,否则就会出问题(不是API不起作用,而是使用了错误的坐标值)

    单独改变坐标的代码如下,可不断左移: procedure TForm1.Button1Click(Sender: TObject); begin SetWindowPos(panel1.Handle, ...

  2. maven jetty

    父项目: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons- ...

  3. 【HDOJ】3295 An interesting mobile game

    其实就是一道搜索模拟题.因为数据量小,用char就够了. /* 3295 */ #include <iostream> #include <cstdio> #include & ...

  4. 【HDOJ】1483 Automatic Correction of Misspellings

    水模拟题. /* 1483 */ #include <cstdio> #include <cstring> #include <cstdlib> #define M ...

  5. 牛逼的bootcss之buttons

    css源码 /*! @license * * Buttons * Copyright 2012-2014 Alex Wolfe and Rob Levin * * Licensed under the ...

  6. P2032 「Poetize9」升降梯上

    描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄.Nescafe之塔一共有N层,升降 ...

  7. -_-#【CSS3】CSS3 gradient transition with background-position

    CSS3 gradient transition with background-position <!DOCTYPE html> <html> <head> &l ...

  8. 【动态规划】Vijos P1680 距离

    题目链接: https://vijos.org/p/1680 题目大意: 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“ab ...

  9. margin:-75px的理解及妙用——纯CSS制作水平/垂直都居中短边为50px/长边为150px的红色十字架

    有这么一个题目: 使用重构的方式制作出一个如下图的水平.垂直都居中短边为50px,长边为150px的红色十字架. 要求只使用2个div完成 答案: <!DOCTYPE html PUBLIC & ...

  10. win7使用USB转串口连接mini2440方法

    不想嚼别人吃剩的馍.我只说我自己是怎么痛苦的连上的. 环境设备: window7笔记本,没有串口,装有XP和Ubuntu2个虚拟机(不是必须的,我只是说明一下我的环境) 友善之臂mini2440(含U ...