guava排序器Ordering
目录
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值放在列表最前面,再去自然排序。
4 运用排序器
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相关推荐
- [Google Guava] 排序: Guava强大的”流畅风格比较器”
原文链接 译者: 沈义扬 排序器[Ordering]是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能. 从实现上说,Ordering实例就是 ...
- R语言对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法、data.table、dplyr等方案
R语言对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法.data.table.dplyr等方案 目录
- R语言基于多字段(多数据列、multiple columns)对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法、data.table、dplyr等方案
R语言基于多字段(多数据列.multiple columns)对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法.data.table.dplyr等方案 目录
- 泛型排序器TComparer
测试代码文件: -------------------------------------------------------------------------------- unit Unit ...
- 汉字转拼音,中文拼音排序器
汉字转拼音 NSMutableString *ms = [[NSMutableString alloc] initWithString:@"我是中国人"]; if (CFStrin ...
- 动态列排序_Excel表格利用函数制作排序器(可依据不同字段、升降序排序)
Excel表格中的排序功能是我们经常使用的一个功能,排序的方式主要有升序排序.降序排序和自定义排序.前两种排序方式默认的排序依据都是所选排序区域的第一列数据,自定义排序用户可以自定排序的主要依据和次要 ...
- 数据结构 (C++)笔记6 (有序列表 排序器)
有序列表 & 排序器 有序列表 若列表中所有节点的逻辑次序与其大小次序完全一致,则称作有序列表. 唯一化 template <typename T> int List<T&g ...
- Guava缓存器源码分析——缓存统计器
Guava缓存器统计器实现: 全局统计器-- 1.CacheBuilder的静态成员变量Supplier<StatsCounter> CACHE_STATS_COUNTER初始化时,重载的 ...
- scala 排序接口Ordering
Ordering 特质入门简介 排序是一种trait,其每个实例代表一种对类型实例进行排序的策略. trait Ordering[T] extends Comparator[T] with Parti ...
最新文章
- LSGO软件技术团队招新 线下组队学习
- webClient 利用代理连接Rss资源
- Paxos Made Simple(译)
- 在树莓派上借助Mono + Jexus 布署 .Net 4.0 WebForm应用
- Python基础教程: with语句详解
- Apache与Tomcat使用
- 你们需要的数据集,都给准备好了!
- c# 非顶层截屏_C#中三种截屏方式总结
- 学习笔记01:1.1 基于概率的信任
- 游戏用户体验指标_电子游戏如何超越游戏化的用户体验
- linux 安装python3.8的几种方法
- python怎么读数据库_Python如何读写SQLite数据库
- 03 Java基本语句结构
- 再见了,Docker Desktop!
- spl_autoload_register 和 __autoload()魔术方法
- 字符常量参加表达式运算
- c语言字符串把小写转换大写字母,c语言将字符串中的小写字母转换成大写字母...
- 保研夏令营/预推免联系老师邮件模板
- 微信小程序 定位 获取经纬度城市街道等位置信息
- 基于Python的双USB摄像头实时预览保存软件
热门文章
- android 图片百分比显示,Android编程实现等比例显示图片的方法
- 业务架构·应用架构·数据架构实战~TOGAF理论全景解读
- linux 主分区转换 lvm,Linux磁盘管理,分区,格式化,lvm
- C语言学习笔记——函数的嵌套
- RN-borderRadius 失效问题
- WEB三维地球APP三维地球
- 来淘派,跳入Web 3.0的“兔子洞”
- ROS ANDROID
- 海藻酸钠-聚乙二醇-反式环辛烯|TCO-PEG-alginate|海藻酸钠-聚乙二醇-PEG-TCO
- linux下awk命令详解,Linux:awk命令详解