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的生命周期是一个常量。

  简单实例:

  1. import java.util.List;
  2. import org.junit.Test;
  3. import com.google.common.collect.Lists;
  4. import com.google.common.collect.Ordering;
  5.  
  6. public class OrderingTest {
  7.  
  8. @Test
  9. public void testStaticOrdering(){
  10. List<String> list = Lists.newArrayList();
  11. list.add("peida");
  12. list.add("jerry");
  13. list.add("harry");
  14. list.add("eva");
  15. list.add("jhon");
  16. list.add("neron");
  17.  
  18. System.out.println("list:"+ list);

  19. Ordering<String> naturalOrdering = Ordering.natural();
  20. Ordering<Object> usingToStringOrdering = Ordering.usingToString();
  21. Ordering<Object> arbitraryOrdering = Ordering.arbitrary();
  22.  
  23. System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
  24. System.out.println("usingToStringOrdering:"+ usingToStringOrdering.sortedCopy(list));
  25. System.out.println("arbitraryOrdering:"+ arbitraryOrdering.sortedCopy(list));
  26. }
  27. }

  输出:

  1. list:[peida, jerry, harry, eva, jhon, neron]
  2. naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
  3. usingToStringOrdering:[eva, harry, jerry, jhon, neron, peida]
  4. 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):返回指定的元素作为一个列表的排序副本。

  1. package com.peidasoft.guava.base;
  2.  
  3. import java.util.List;
  4.  
  5. import org.junit.Test;
  6.  
  7. import com.google.common.collect.ImmutableList;
  8. import com.google.common.collect.Lists;
  9. import com.google.common.collect.Ordering;
  10.  
  11. public class OrderingTest {
  12.  
  13. @Test
  14. public void testOrdering(){
  15. List<String> list = Lists.newArrayList();
  16. list.add("peida");
  17. list.add("jerry");
  18. list.add("harry");
  19. list.add("eva");
  20. list.add("jhon");
  21. list.add("neron");
  22.  
  23. System.out.println("list:"+ list);
  24.  
  25. Ordering<String> naturalOrdering = Ordering.natural();
  26. System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
  27.  
  28. List<Integer> listReduce= Lists.newArrayList();
  29. for(int i=9;i>0;i--){
  30. listReduce.add(i);
  31. }
  32.  
  33. List<Integer> listtest= Lists.newArrayList();
  34. listtest.add(1);
  35. listtest.add(1);
  36. listtest.add(1);
  37. listtest.add(2);
  38.  
  39. Ordering<Integer> naturalIntReduceOrdering = Ordering.natural();
  40.  
  41. System.out.println("listtest:"+ listtest);
  42. System.out.println(naturalIntReduceOrdering.isOrdered(listtest));
  43. System.out.println(naturalIntReduceOrdering.isStrictlyOrdered(listtest));
  44.  
  45. System.out.println("naturalIntReduceOrdering:"+ naturalIntReduceOrdering.sortedCopy(listReduce));
  46. System.out.println("listReduce:"+ listReduce);
  47.  
  48. System.out.println(naturalIntReduceOrdering.isOrdered(naturalIntReduceOrdering.sortedCopy(listReduce)));
  49. System.out.println(naturalIntReduceOrdering.isStrictlyOrdered(naturalIntReduceOrdering.sortedCopy(listReduce)));
  50.  
  51. Ordering<String> natural = Ordering.natural();
  52.  
  53. List<String> abc = ImmutableList.of("a", "b", "c");
  54. System.out.println(natural.isOrdered(abc));
  55. System.out.println(natural.isStrictlyOrdered(abc));
  56.  
  57. System.out.println("isOrdered reverse :"+ natural.reverse().isOrdered(abc));
  58.  
  59. List<String> cba = ImmutableList.of("c", "b", "a");
  60. System.out.println(natural.isOrdered(cba));
  61. System.out.println(natural.isStrictlyOrdered(cba));
  62. System.out.println(cba = natural.sortedCopy(cba));
  63.  
  64. System.out.println("max:"+natural.max(cba));
  65. System.out.println("min:"+natural.min(cba));
  66.  
  67. System.out.println("leastOf:"+natural.leastOf(cba, 2));
  68. System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
  69. System.out.println("leastOf list:"+naturalOrdering.leastOf(list, 3));
  70. System.out.println("greatestOf:"+naturalOrdering.greatestOf(list, 3));
  71. System.out.println("reverse list :"+ naturalOrdering.reverse().sortedCopy(list));
  72. System.out.println("isOrdered list :"+ naturalOrdering.isOrdered(list));
  73. System.out.println("isOrdered list :"+ naturalOrdering.reverse().isOrdered(list));
  74. list.add(null);
  75. System.out.println(" add null list:"+list);
  76. System.out.println("nullsFirst list :"+ naturalOrdering.nullsFirst().sortedCopy(list));
  77. System.out.println("nullsLast list :"+ naturalOrdering.nullsLast().sortedCopy(list));
  78. }
  79.  
  80. }
  81.  
  82. //============输出==============
  83. list:[peida, jerry, harry, eva, jhon, neron]
  84. naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
  85. listtest:[1, 1, 1, 2]
  86. true
  87. false
  88. naturalIntReduceOrdering:[1, 2, 3, 4, 5, 6, 7, 8, 9]
  89. listReduce:[9, 8, 7, 6, 5, 4, 3, 2, 1]
  90. true
  91. true
  92. true
  93. true
  94. isOrdered reverse :false
  95. false
  96. false
  97. [a, b, c]
  98. max:c
  99. min:a
  100. leastOf:[a, b]
  101. naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
  102. leastOf list:[eva, harry, jerry]
  103. greatestOf:[peida, neron, jhon]
  104. reverse list :[peida, neron, jhon, jerry, harry, eva]
  105. isOrdered list :false
  106. isOrdered list :false
  107. add null list:[peida, jerry, harry, eva, jhon, neron, null]
  108. nullsFirst list :[null, eva, harry, jerry, jhon, neron, peida]
  109. nullsLast list :[eva, harry, jerry, jhon, neron, peida, null]

Ordering犀利的比较器的更多相关文章

  1. Guava学习笔记(4):Ordering犀利的比较器

    转自:http://www.cnblogs.com/peida/p/Guava_Ordering.html Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering ...

  2. Guava学习笔记:Ordering犀利的比较器

    Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易扩展,可以轻松构造复杂的comparator,然后用在 ...

  3. Guava API学习之Ordering犀利的比较器 编辑

    Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易扩展,可以轻松构造复杂的comparator,然后用在 ...

  4. Ordering是Guava

    Guava学习笔记:Ordering犀利的比较器   Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易 ...

  5. Guava源码学习(二)Ordering

    基于版本:Guava 22.0 Wiki:Ordering 0. Ordering简介 Guava的Ordering提供了链式风格的比较器的实现,我们可以用Ordering轻松构建复杂的比较器. 1. ...

  6. java常用集合类详解(有例子,集合类糊涂的来看!)

    Framework集合框架是一个统一的架构,用来表示和操作集合.集合框架主要是由接口,抽象类和实现类构成.接口:蓝色:实现类:红色Collection|_____Set(HashSet)|       ...

  7. Spark(三)【RDD中的自定义排序】

    在RDD中默认的算子sortBy,sortByKey只能真的值类型数据升序或者降序 现需要对自定义对象进行自定义排序. 一组Person对象 /** * Person 样例类 * @param nam ...

  8. Scala比较器:Ordered与Ordering

    在项目中,我们常常会遇到排序(或比较)需求,比如:对一个Person类 case class Person(name: String, age: Int) { override def toStrin ...

  9. Scala比较器---Ordered与Ordering

    1.Ordered 和 Ordering Scala提供两个特质(trait)Ordered与Ordering用于比较.其中,Ordered混入(mix)Java的Comparable接口,而Orde ...

随机推荐

  1. sql语句查询表中重复字段以及显示字段重复条数

    今天跟大家分享两条SQL语句,是关于查询某表中重复字段以及显示该字段的重复条数. 1.select * from 表名 where 列名 in (select 列名 from 表名 group by ...

  2. [Domino]Java访问Domino必需配置的服务器设置

    应用场景 我们需要通过Java远程访问IBM Lotus Domino R6和R5服务器,从中获取用户邮箱的邮件信息等关键数据.我们不需要提供每一个用户密码以及ID文件. 我们的具体做法是,通过Dom ...

  3. 2MySQL Server 系统架构

    2.2MySQL Server 系统架构 总的来说,MySQL 可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限 ...

  4. Visual Studio 2013创建自定义多项目模版

    首先附上效果图: 可以看到输入解决方案名称后,自动创建了我事先写好的架构,并且项目名及Server层名称都变了,并且依然保持了引用关系. 下面讲具体步骤: 第一步:建立解决方案,并将需要的代码全部写好 ...

  5. Windows ML,系统内置的机器学习平台初探

    人工智能现在很火,虽然最近风头隐隐有被区块链盖过,但仍是未来技术转型的首选方向之一.作为AI核心的机器学习,目前也进化到了可以基于平台自动训练模型的地步,例如Azure Machine Learnin ...

  6. JavaScript头像上传器的实现

    最近做这方面的东西,刚开始准备用一个开源项目:https://github.com/yueyoum/django-upload-avatar 后来发现这个开源组件的原设计者的定制化选项设计略显复杂,发 ...

  7. spring cloud 入门系列五:使用Feign 实现声明式服务调用

    一.Spring Cloud Feign概念引入通过前面的随笔,我们了解如何通过Spring Cloud ribbon进行负责均衡,如何通过Spring Cloud Hystrix进行服务断路保护,两 ...

  8. 修改ZendStudio新建php文件时的模板

    zendstudio默认的模板不适用,可以自己到Window -- preferences -- php -- code style -- code templates -- code -- samp ...

  9. 通过数据流处理-微信小程序生成临时二维码

    1.小程序代码 onLoad: function (options) { var that = this api.Login(function (login) { var codeModel = ne ...

  10. 【定时器】Quartz初步实验

    第一步:创建项目 创建一个新项目,可以是ASP.NET MVC,WebForms,Winforms等多种.Net项目,这里使用的是VS2017,创建了一个MVC项目 创建完成后大致项目层级为: 第二部 ...