Java Guava排序器Ordering原理及代码实例
一创建排序器
排序器:可以用来为构建复杂的比较器,以完成集合排序的功能:
本质上来说,Ordering实例无非就是一个特殊的Comparator实例。
Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),
并且提供了链式调用方法,来定制和增强现有的比较器
//创建排序器
@Test
publicvoidcreateOreing(){
//对可排序类型做自然排序,如数字按大小,日期按先后排序
Orderingnatural=Ordering.natural();
//按对象的字符串形式做字典排序
Ordering.usingToString();
//把给定的Comparator转化为排序器或者继承Ordering实现自定义排序器
Orderingfrom=Ordering.from((Integerx,Integery)->Ints.compare(x,y));
System.out.println(from.max(5,6));
}
二扩展排序器,变换成其他功能排序器
//衍生其他排序器
@Test
publicvoidanotherOreing(){
Orderingnatural=Ordering.natural();
natural.max(1,2);//2
//获取语义相反的排序器
natural.reverse().max(1,2);//1
Listlist=Lists.newArrayList(5,9,3,7,4);
Collections.sort(list,natural.nullsFirst());//使用排序器对集合排序
list.forEach(x->System.out.print(x+","));//3,4,5,7,9
//不使用这两个排序器,排序元素不能为null,否则会报空指针
natural.nullsFirst();//使用当前排序器,并把null值排到最前
natural.nullsLast();//使用当前排序器,并把null值排到最后
natural.compound(natural);//合成另一个比较器,以处理当前排序器中的相等情况,即添加第二个比较器
//onResultOf:将function应用在各个元素上之后,在使用原始ordering进行排序
Collections.sort(list,natural.onResultOf(x->x*(-1)));//元素变为负数再排序
list.forEach(x->System.out.print(x+","));//9,7,5,4,3
}
三使用排序器
//使用排序器
@Test
publicvoidoperOrdering(){
Orderingnatural=Ordering.natural();
Listlist02=Lists.newArrayList(6,4,9,3,1,5,3);
/**
*greatestOf:获取可迭代对象中最大的k个元素,并按从大到小排序,返回一个集合
*leastOfL获取最小的几个,并按从小到大排序
*/
natural.greatestOf(list02,1).forEach(x->System.out.println(x));//9
natural.leastOf(list02,1).forEach(x->System.out.println(x));//1
//返回集合的一个排好序的副本
natural.sortedCopy(list02);
natural.immutableSortedCopy(list02);//返回不可变的排序副本
/**
*isOrdered:判断是否已经按排序器有序,元素不能少于2,允许有相等元素
*isStrictlyOrdered:是否严格排序,不允许有相等元素
*/
Collections.sort(list02,natural);
natural.isOrdered(list02);//true
natural.isStrictlyOrdered(list02);//false
//其他直接比较元素
natural.compare(1,2);natural.max(5,6);natural.min(list02);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。