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]

Guava学习笔记:Ordering犀利的比较器的更多相关文章

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

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

  2. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

  3. Guava学习笔记目录

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

  4. guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁

    guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...

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

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

  6. Ordering犀利的比较器

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

  7. Guava学习笔记(一)概览

    Guava是谷歌开源的一套Java开发类库,以简洁的编程风格著称,提供了很多实用的工具类, 在之前的工作中应用过Collections API和Guava提供的Cache,不过对Guava没有一个系统 ...

  8. Guava学习笔记:Google Guava 类库简介

    http://www.cnblogs.com/peida/tag/Guava/ Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, cachin ...

  9. guava 学习笔记 瓜娃(guava)的API快速熟悉使用

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...

随机推荐

  1. iOS-数据持久化-属性列表

    属性列表 属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfF ...

  2. SDWebImage清除图片缓存

    背景: 使用 SDWebImage 库,由于内存中一直缓存着加载的图片,而导致内存过高(我们无法手动管理内存),弹出内存警告而导致程序很卡或者直接crash掉. 我的解决方法: 在AppDelegat ...

  3. java中同步嵌套引起的死锁事例代码

    /* 目的:自己写一个由于同步嵌套引起的死锁! 思路:多个线程在执行时,某一时刻,0-Thread绑定了LockA锁,1-Thread绑定了LockB锁! 当0-Thread要去绑定LockB锁时 和 ...

  4. 邻接表有向图(三)之 Java详解

    前面分别介绍了邻接表有向图的C和C++实现,本文通过Java实现邻接表有向图. 目录 1. 邻接表有向图的介绍 2. 邻接表有向图的代码说明 3. 邻接表有向图的完整源码 转载请注明出处:http:/ ...

  5. 解决Myeclipse下Debug出现Source not found以及sql server中导入数据报错

    前言:在空间里回顾了我的2014,从生活.技术.家庭等各方面对自己进行总结剖析,也是给自己一个交代.也想在博客上专门写一篇2014年度菜鸟的技术路回忆录,但是因为各种事一再耽搁了,现在来写也就更显得不 ...

  6. Android中include标签的使用

    在Android的开发中,我们知道布局文件可以让我们很方便的对各个UI控件进行位置安排跟属性设置,而在程序中可以直接取得控件并赋予对应操作功能.但是,如果是一个复杂的界面设计,我们把所有布局都放在一个 ...

  7. ansible入门

    前言 最近看了一下ansible,挺火的一个配置管理工具,对比老大哥puppet,使用起来要简单一些,并且可以批量执行命令,对比同是python语言编写的saltstack,不需要安装客户端(基于pa ...

  8. Moon转告给你一个比Log4net更好日志框架--TracerX Logger 及其对应的日志查看器

    一.介绍 TracerX logger是一个易于上手,且拥有众多高级特性的.NET日志框架. 它能够发送输出结果到多目的地(循环文件.事件日志等....).它也能生成文本和二进制文件.它拥有一个强大的 ...

  9. iOS宏定义的使用与规范

    宏定义在很多方面都会使用,例如定义高度.判断iOS系统.工具类,还有诸如文件路径.服务端api接口文档.为了对宏能够快速定位和了解其功能,我们最好在定义的时候将其放入特定的头文件中 定义尺寸类的宏 D ...

  10. php的<?php ?>标签匹配

    在公司实习了没有多久就开始和同事发现了一个问题,就是之前的人写过的项目经常莫名其妙的出错,仔细的看项目的源代码的时候发现项目中并没有逻辑上的错误,而且各种关系以及数据都没有问题,这是为什么呢.再次认真 ...