Ordering犀利的比较器
Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强。它非常容易扩展,可以轻松构造复杂的comparator,然后用在容器的比较、排序等操作中。
本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例。Ordering只是需要依赖于一个比较器(例如,Collections.max)的方法,并使其可作为实例方法。另外,Ordering提供了链式方法调用和加强现有的比较器。
下面我们看看Ordering中的一些具体方法和简单的使用实例。
常见的静态方法:
natural():使用Comparable类型的自然顺序, 例如:整数从小到大,字符串是按字典顺序;
usingToString() :使用toString()返回的字符串按字典顺序进行排序;
arbitrary() :返回一个所有对象的任意顺序, 即compare(a, b) == 0 就是 a == b (identity equality)。 本身的排序是没有任何含义, 但是在VM的生命周期是一个常量。
简单实例:

- import java.util.List;
- import org.junit.Test;
- import com.google.common.collect.Lists;
- import com.google.common.collect.Ordering;
- public class OrderingTest {
- @Test
- public void testStaticOrdering(){
- List<String> list = Lists.newArrayList();
- list.add("peida");
- list.add("jerry");
- list.add("harry");
- list.add("eva");
- list.add("jhon");
- list.add("neron");
- System.out.println("list:"+ list);
- Ordering<String> naturalOrdering = Ordering.natural();
- Ordering<Object> usingToStringOrdering = Ordering.usingToString();
- Ordering<Object> arbitraryOrdering = Ordering.arbitrary();
- System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
- System.out.println("usingToStringOrdering:"+ usingToStringOrdering.sortedCopy(list));
- System.out.println("arbitraryOrdering:"+ arbitraryOrdering.sortedCopy(list));
- }
- }

输出:
- list:[peida, jerry, harry, eva, jhon, neron]
- naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
- usingToStringOrdering:[eva, harry, jerry, jhon, neron, peida]
- arbitraryOrdering:[neron, harry, eva, jerry, peida, jhon]
操作方法:
reverse(): 返回与当前Ordering相反的排序:
nullsFirst(): 返回一个将null放在non-null元素之前的Ordering,其他的和原始的Ordering一样;
nullsLast():返回一个将null放在non-null元素之后的Ordering,其他的和原始的Ordering一样;
compound(Comparator):返回一个使用Comparator的Ordering,Comparator作为第二排序元素,例如对bug列表进行排序,先根据bug的级别,再根据优先级进行排序;
lexicographical():返回一个按照字典元素迭代的Ordering;
onResultOf(Function):将function应用在各个元素上之后, 在使用原始ordering进行排序;
greatestOf(Iterable iterable, int k):返回指定的第k个可迭代的最大的元素,按照这个从最大到最小的顺序。是不稳定的。
leastOf(Iterable<E> iterable,int k):返回指定的第k个可迭代的最小的元素,按照这个从最小到最大的顺序。是不稳定的。
isOrdered(Iterable):是否有序,Iterable不能少于2个元素。
isStrictlyOrdered(Iterable):是否严格有序。请注意,Iterable不能少于两个元素。
sortedCopy(Iterable):返回指定的元素作为一个列表的排序副本。

- package com.peidasoft.guava.base;
- import java.util.List;
- import org.junit.Test;
- import com.google.common.collect.ImmutableList;
- import com.google.common.collect.Lists;
- import com.google.common.collect.Ordering;
- public class OrderingTest {
- @Test
- public void testOrdering(){
- List<String> list = Lists.newArrayList();
- list.add("peida");
- list.add("jerry");
- list.add("harry");
- list.add("eva");
- list.add("jhon");
- list.add("neron");
- System.out.println("list:"+ list);
- Ordering<String> naturalOrdering = Ordering.natural();
- System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
- List<Integer> listReduce= Lists.newArrayList();
- for(int i=9;i>0;i--){
- listReduce.add(i);
- }
- List<Integer> listtest= Lists.newArrayList();
- listtest.add(1);
- listtest.add(1);
- listtest.add(1);
- listtest.add(2);
- Ordering<Integer> naturalIntReduceOrdering = Ordering.natural();
- System.out.println("listtest:"+ listtest);
- System.out.println(naturalIntReduceOrdering.isOrdered(listtest));
- System.out.println(naturalIntReduceOrdering.isStrictlyOrdered(listtest));
- System.out.println("naturalIntReduceOrdering:"+ naturalIntReduceOrdering.sortedCopy(listReduce));
- System.out.println("listReduce:"+ listReduce);
- System.out.println(naturalIntReduceOrdering.isOrdered(naturalIntReduceOrdering.sortedCopy(listReduce)));
- System.out.println(naturalIntReduceOrdering.isStrictlyOrdered(naturalIntReduceOrdering.sortedCopy(listReduce)));
- Ordering<String> natural = Ordering.natural();
- List<String> abc = ImmutableList.of("a", "b", "c");
- System.out.println(natural.isOrdered(abc));
- System.out.println(natural.isStrictlyOrdered(abc));
- System.out.println("isOrdered reverse :"+ natural.reverse().isOrdered(abc));
- List<String> cba = ImmutableList.of("c", "b", "a");
- System.out.println(natural.isOrdered(cba));
- System.out.println(natural.isStrictlyOrdered(cba));
- System.out.println(cba = natural.sortedCopy(cba));
- System.out.println("max:"+natural.max(cba));
- System.out.println("min:"+natural.min(cba));
- System.out.println("leastOf:"+natural.leastOf(cba, 2));
- System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
- System.out.println("leastOf list:"+naturalOrdering.leastOf(list, 3));
- System.out.println("greatestOf:"+naturalOrdering.greatestOf(list, 3));
- System.out.println("reverse list :"+ naturalOrdering.reverse().sortedCopy(list));
- System.out.println("isOrdered list :"+ naturalOrdering.isOrdered(list));
- System.out.println("isOrdered list :"+ naturalOrdering.reverse().isOrdered(list));
- list.add(null);
- System.out.println(" add null list:"+list);
- System.out.println("nullsFirst list :"+ naturalOrdering.nullsFirst().sortedCopy(list));
- System.out.println("nullsLast list :"+ naturalOrdering.nullsLast().sortedCopy(list));
- }
- }
- //============输出==============
- list:[peida, jerry, harry, eva, jhon, neron]
- naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
- listtest:[1, 1, 1, 2]
- true
- false
- naturalIntReduceOrdering:[1, 2, 3, 4, 5, 6, 7, 8, 9]
- listReduce:[9, 8, 7, 6, 5, 4, 3, 2, 1]
- true
- true
- true
- true
- isOrdered reverse :false
- false
- false
- [a, b, c]
- max:c
- min:a
- leastOf:[a, b]
- naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
- leastOf list:[eva, harry, jerry]
- greatestOf:[peida, neron, jhon]
- reverse list :[peida, neron, jhon, jerry, harry, eva]
- isOrdered list :false
- isOrdered list :false
- add null list:[peida, jerry, harry, eva, jhon, neron, null]
- nullsFirst list :[null, eva, harry, jerry, jhon, neron, peida]
- nullsLast list :[eva, harry, jerry, jhon, neron, peida, null]

Ordering犀利的比较器的更多相关文章
- Guava学习笔记(4):Ordering犀利的比较器
转自:http://www.cnblogs.com/peida/p/Guava_Ordering.html Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering ...
- Guava学习笔记:Ordering犀利的比较器
Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易扩展,可以轻松构造复杂的comparator,然后用在 ...
- Guava API学习之Ordering犀利的比较器 编辑
Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易扩展,可以轻松构造复杂的comparator,然后用在 ...
- Ordering是Guava
Guava学习笔记:Ordering犀利的比较器 Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易 ...
- Guava源码学习(二)Ordering
基于版本:Guava 22.0 Wiki:Ordering 0. Ordering简介 Guava的Ordering提供了链式风格的比较器的实现,我们可以用Ordering轻松构建复杂的比较器. 1. ...
- java常用集合类详解(有例子,集合类糊涂的来看!)
Framework集合框架是一个统一的架构,用来表示和操作集合.集合框架主要是由接口,抽象类和实现类构成.接口:蓝色:实现类:红色Collection|_____Set(HashSet)| ...
- Spark(三)【RDD中的自定义排序】
在RDD中默认的算子sortBy,sortByKey只能真的值类型数据升序或者降序 现需要对自定义对象进行自定义排序. 一组Person对象 /** * Person 样例类 * @param nam ...
- Scala比较器:Ordered与Ordering
在项目中,我们常常会遇到排序(或比较)需求,比如:对一个Person类 case class Person(name: String, age: Int) { override def toStrin ...
- Scala比较器---Ordered与Ordering
1.Ordered 和 Ordering Scala提供两个特质(trait)Ordered与Ordering用于比较.其中,Ordered混入(mix)Java的Comparable接口,而Orde ...
随机推荐
- sql语句查询表中重复字段以及显示字段重复条数
今天跟大家分享两条SQL语句,是关于查询某表中重复字段以及显示该字段的重复条数. 1.select * from 表名 where 列名 in (select 列名 from 表名 group by ...
- [Domino]Java访问Domino必需配置的服务器设置
应用场景 我们需要通过Java远程访问IBM Lotus Domino R6和R5服务器,从中获取用户邮箱的邮件信息等关键数据.我们不需要提供每一个用户密码以及ID文件. 我们的具体做法是,通过Dom ...
- 2MySQL Server 系统架构
2.2MySQL Server 系统架构 总的来说,MySQL 可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限 ...
- Visual Studio 2013创建自定义多项目模版
首先附上效果图: 可以看到输入解决方案名称后,自动创建了我事先写好的架构,并且项目名及Server层名称都变了,并且依然保持了引用关系. 下面讲具体步骤: 第一步:建立解决方案,并将需要的代码全部写好 ...
- Windows ML,系统内置的机器学习平台初探
人工智能现在很火,虽然最近风头隐隐有被区块链盖过,但仍是未来技术转型的首选方向之一.作为AI核心的机器学习,目前也进化到了可以基于平台自动训练模型的地步,例如Azure Machine Learnin ...
- JavaScript头像上传器的实现
最近做这方面的东西,刚开始准备用一个开源项目:https://github.com/yueyoum/django-upload-avatar 后来发现这个开源组件的原设计者的定制化选项设计略显复杂,发 ...
- spring cloud 入门系列五:使用Feign 实现声明式服务调用
一.Spring Cloud Feign概念引入通过前面的随笔,我们了解如何通过Spring Cloud ribbon进行负责均衡,如何通过Spring Cloud Hystrix进行服务断路保护,两 ...
- 修改ZendStudio新建php文件时的模板
zendstudio默认的模板不适用,可以自己到Window -- preferences -- php -- code style -- code templates -- code -- samp ...
- 通过数据流处理-微信小程序生成临时二维码
1.小程序代码 onLoad: function (options) { var that = this api.Login(function (login) { var codeModel = ne ...
- 【定时器】Quartz初步实验
第一步:创建项目 创建一个新项目,可以是ASP.NET MVC,WebForms,Winforms等多种.Net项目,这里使用的是VS2017,创建了一个MVC项目 创建完成后大致项目层级为: 第二部 ...