目录

1. 排序器的创建

2. 剖析与原生排序的区别

3. 链式调用

3.1 reverse()

3.2 nullsFirst()/nullsLast()

4 运用排序器

4.1 isOrdered

4.2 greatestOf

4.3 min/max


排序器Ordering,是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。

1. 排序器的创建

Ordering静态创建排序器

方法 描述
natural() 对可排序类型做自然排序,如数字按大小,日期按先后排序
usingToString() 按对象的字符串形式做字典排序[lexicographical ordering]
from(Comparator) 把给定的Comparator转化为排序器

以natural方法为例

2. 剖析与原生排序的区别

以natural方法为例,剖析dubbo提供的集合工具类和guava排序器的区别

list.sort(Ordering.natural()); //源码分析

    // list.sort(Ordering.natural())default void sort(Comparator<? super E> c) {Object[] a = this.toArray();Arrays.sort(a, (Comparator) c);ListIterator<E> i = this.listIterator();for (Object e : a) {i.next();i.set((E) e);}}// Arrays.sort(a, (Comparator) c);public static <T> void sort(T[] a, Comparator<? super T> c) {if (c == null) {sort(a);} else {if (LegacyMergeSort.userRequested)legacyMergeSort(a, c);elseTimSort.sort(a, 0, a.length, c, null, 0, 0);}}

CollectionUtils.sort(list); //源码分析

    // CollectionUtils.sort(list)public static <T> List<T> sort(List<T> list) {if (isNotEmpty(list)) {Collections.sort(list);}return list;}// Collections.sort(list)public static <T extends Comparable<? super T>> void sort(List<T> list) {list.sort(null);}

可见,CollectionUtils.sort只是包了一层,底层也是调用了list.sort方法,只是比较器为null

再往下看,可看到排序时的比较核心代码,guava的方式是使用自己实现Comparator的compare方法去比较,而dubbo提供的集合工具类则是通过类本身实现的compareTo方法去比较

// list.sort(Ordering.natural())
c.compare(a[runHi], a[runHi - 1]) < 0// CollectionUtils.sort(list)
(Comparable) a[runHi]).compareTo(a[runHi - 1]) < 0

Integer类实现的compareTo方法如下

    public int compareTo(Integer anotherInteger) {return compare(this.value, anotherInteger.value);}public static int compare(int x, int y) {return (x < y) ? -1 : ((x == y) ? 0 : 1);}

guava的Ordering排序起实现了Comparator,实现了compare方法,但实际上在本例子Integer类型的排序中,NaturalOrdering的比较方法最终用的还是Integer类的compareTo方法

  @Overridepublic abstract int compare(@Nullable T left, @Nullable T right);// NaturalOrdering@Overridepublic int compare(Comparable left, Comparable right) {checkNotNull(left); // for GWTcheckNotNull(right);return left.compareTo(right);}

每种排序器实现的compare方法不同

3. 链式调用

通过链式调用,可以由给定的排序器衍生出其它排序器

3.1 reverse()

获取语义相反的排序器

list.sort(Ordering.natural().reverse()); // 9,7,4,3,1

3.2 nullsFirst()/nullsLast()

使用当前排序器,并将null值放在最前面/最后面。若排序列表中有null值,用原生排序会报空指针异常

List<Integer> list = Lists.newArrayList(1, 3, 9, null, 4, 7);list.sort(Ordering.natural().nullsFirst()); // list:[null,1,3,4,7,9]list.sort(Ordering.natural().nullsLast()); // list:[1,3,4,7,9,null]

当阅读链式调用产生的排序器时,应该从后往前读。之所以要从后往前读,是因为每次链式调用都是用后面的方法包装了前面的排序器。例如上面,是先将null值放在列表最前面,再去自然排序。

运用排序器

Guava的排序器实现有若干操纵集合或元素值的方法

4.1 isOrdered

判断可迭代对象是否已按排序器排序:允许有排序值相等的元素。

List<Integer> list = Lists.newArrayList(1, 3, 9, 4, 7);
boolean result = Ordering.natural().isOrdered(list); // false 

4.2 greatestOf

获取可迭代对象中前的k个元素。

List<Integer> list2 = Ordering.natural().greatestOf(list, 3);
// list2:[9,7,4]
List<Integer> list3 = Ordering.natural().reverse().greatestOf(list, 3);
// list3:[1,3,4]

4.3 min/max

获取最大最小值

Integer max = Ordering.natural().max(list);// 9
Integer min = Ordering.natural().min(list);// 1

guava排序器Ordering相关推荐

  1. [Google Guava] 排序: Guava强大的”流畅风格比较器”

    原文链接 译者: 沈义扬 排序器[Ordering]是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能. 从实现上说,Ordering实例就是 ...

  2. R语言对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法、data.table、dplyr等方案

    R语言对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法.data.table.dplyr等方案 目录

  3. R语言基于多字段(多数据列、multiple columns)对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法、data.table、dplyr等方案

    R语言基于多字段(多数据列.multiple columns)对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法.data.table.dplyr等方案 目录

  4. 泛型排序器TComparer

    测试代码文件: --------------------------------------------------------------------------------   unit Unit ...

  5. 汉字转拼音,中文拼音排序器

    汉字转拼音 NSMutableString *ms = [[NSMutableString alloc] initWithString:@"我是中国人"]; if (CFStrin ...

  6. 动态列排序_Excel表格利用函数制作排序器(可依据不同字段、升降序排序)

    Excel表格中的排序功能是我们经常使用的一个功能,排序的方式主要有升序排序.降序排序和自定义排序.前两种排序方式默认的排序依据都是所选排序区域的第一列数据,自定义排序用户可以自定排序的主要依据和次要 ...

  7. 数据结构 (C++)笔记6 (有序列表 排序器)

    有序列表 & 排序器 有序列表 若列表中所有节点的逻辑次序与其大小次序完全一致,则称作有序列表. 唯一化 template <typename T> int List<T&g ...

  8. Guava缓存器源码分析——缓存统计器

    Guava缓存器统计器实现: 全局统计器-- 1.CacheBuilder的静态成员变量Supplier<StatsCounter> CACHE_STATS_COUNTER初始化时,重载的 ...

  9. scala 排序接口Ordering

    Ordering 特质入门简介 排序是一种trait,其每个实例代表一种对类型实例进行排序的策略. trait Ordering[T] extends Comparator[T] with Parti ...

最新文章

  1. LSGO软件技术团队招新 线下组队学习
  2. webClient 利用代理连接Rss资源
  3. Paxos Made Simple(译)
  4. 在树莓派上借助Mono + Jexus 布署 .Net 4.0 WebForm应用
  5. Python基础教程: with语句详解
  6. Apache与Tomcat使用
  7. 你们需要的数据集,都给准备好了!
  8. c# 非顶层截屏_C#中三种截屏方式总结
  9. 学习笔记01:1.1 基于概率的信任
  10. 游戏用户体验指标_电子游戏如何超越游戏化的用户体验
  11. linux 安装python3.8的几种方法
  12. python怎么读数据库_Python如何读写SQLite数据库
  13. 03 Java基本语句结构
  14. 再见了,Docker Desktop!
  15. spl_autoload_register 和 __autoload()魔术方法
  16. 字符常量参加表达式运算
  17. c语言字符串把小写转换大写字母,c语言将字符串中的小写字母转换成大写字母...
  18. 保研夏令营/预推免联系老师邮件模板
  19. 微信小程序 定位 获取经纬度城市街道等位置信息
  20. 基于Python的双USB摄像头实时预览保存软件

热门文章

  1. android 图片百分比显示,Android编程实现等比例显示图片的方法
  2. 业务架构·应用架构·数据架构实战~TOGAF理论全景解读
  3. linux 主分区转换 lvm,Linux磁盘管理,分区,格式化,lvm
  4. C语言学习笔记——函数的嵌套
  5. RN-borderRadius 失效问题
  6. WEB三维地球APP三维地球
  7. 来淘派,跳入Web 3.0的“兔子洞”
  8. ROS ANDROID
  9. 海藻酸钠-聚乙二醇-反式环辛烯|TCO-PEG-alginate|海藻酸钠-聚乙二醇-PEG-TCO
  10. linux下awk命令详解,Linux:awk命令详解