Guava学习笔记:Ordering犀利的比较器
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的生命周期是一个常量。
简单实例:
- import java.util.List;
- import org.junit.Test;
- import com.google.common.collect.Lists;
- import com.google.common.collect.Ordering;
- public class OrderingTest {
- @Test
- public void testStaticOrdering(){
- List<String> list = Lists.newArrayList();
- list.add("peida");
- list.add("jerry");
- list.add("harry");
- list.add("eva");
- list.add("jhon");
- list.add("neron");
- System.out.println("list:"+ list);
- Ordering<String> naturalOrdering = Ordering.natural();
- Ordering<Object> usingToStringOrdering = Ordering.usingToString();
- Ordering<Object> arbitraryOrdering = Ordering.arbitrary();
- System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
- System.out.println("usingToStringOrdering:"+ usingToStringOrdering.sortedCopy(list));
- System.out.println("arbitraryOrdering:"+ arbitraryOrdering.sortedCopy(list));
- }
- }
输出:
- list:[peida, jerry, harry, eva, jhon, neron]
- naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
- usingToStringOrdering:[eva, harry, jerry, jhon, neron, peida]
- 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):返回指定的元素作为一个列表的排序副本。
- package com.peidasoft.guava.base;
- import java.util.List;
- import org.junit.Test;
- import com.google.common.collect.ImmutableList;
- import com.google.common.collect.Lists;
- import com.google.common.collect.Ordering;
- public class OrderingTest {
- @Test
- public void testOrdering(){
- List<String> list = Lists.newArrayList();
- list.add("peida");
- list.add("jerry");
- list.add("harry");
- list.add("eva");
- list.add("jhon");
- list.add("neron");
- System.out.println("list:"+ list);
- Ordering<String> naturalOrdering = Ordering.natural();
- System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
- List<Integer> listReduce= Lists.newArrayList();
- for(int i=9;i>0;i--){
- listReduce.add(i);
- }
- List<Integer> listtest= Lists.newArrayList();
- listtest.add(1);
- listtest.add(1);
- listtest.add(1);
- listtest.add(2);
- Ordering<Integer> naturalIntReduceOrdering = Ordering.natural();
- System.out.println("listtest:"+ listtest);
- System.out.println(naturalIntReduceOrdering.isOrdered(listtest));
- System.out.println(naturalIntReduceOrdering.isStrictlyOrdered(listtest));
- System.out.println("naturalIntReduceOrdering:"+ naturalIntReduceOrdering.sortedCopy(listReduce));
- System.out.println("listReduce:"+ listReduce);
- System.out.println(naturalIntReduceOrdering.isOrdered(naturalIntReduceOrdering.sortedCopy(listReduce)));
- System.out.println(naturalIntReduceOrdering.isStrictlyOrdered(naturalIntReduceOrdering.sortedCopy(listReduce)));
- Ordering<String> natural = Ordering.natural();
- List<String> abc = ImmutableList.of("a", "b", "c");
- System.out.println(natural.isOrdered(abc));
- System.out.println(natural.isStrictlyOrdered(abc));
- System.out.println("isOrdered reverse :"+ natural.reverse().isOrdered(abc));
- List<String> cba = ImmutableList.of("c", "b", "a");
- System.out.println(natural.isOrdered(cba));
- System.out.println(natural.isStrictlyOrdered(cba));
- System.out.println(cba = natural.sortedCopy(cba));
- System.out.println("max:"+natural.max(cba));
- System.out.println("min:"+natural.min(cba));
- System.out.println("leastOf:"+natural.leastOf(cba, 2));
- System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
- System.out.println("leastOf list:"+naturalOrdering.leastOf(list, 3));
- System.out.println("greatestOf:"+naturalOrdering.greatestOf(list, 3));
- System.out.println("reverse list :"+ naturalOrdering.reverse().sortedCopy(list));
- System.out.println("isOrdered list :"+ naturalOrdering.isOrdered(list));
- System.out.println("isOrdered list :"+ naturalOrdering.reverse().isOrdered(list));
- list.add(null);
- System.out.println(" add null list:"+list);
- System.out.println("nullsFirst list :"+ naturalOrdering.nullsFirst().sortedCopy(list));
- System.out.println("nullsLast list :"+ naturalOrdering.nullsLast().sortedCopy(list));
- }
- }
- //============输出==============
- list:[peida, jerry, harry, eva, jhon, neron]
- naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
- listtest:[1, 1, 1, 2]
- true
- false
- naturalIntReduceOrdering:[1, 2, 3, 4, 5, 6, 7, 8, 9]
- listReduce:[9, 8, 7, 6, 5, 4, 3, 2, 1]
- true
- true
- true
- true
- isOrdered reverse :false
- false
- false
- [a, b, c]
- max:c
- min:a
- leastOf:[a, b]
- naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
- leastOf list:[eva, harry, jerry]
- greatestOf:[peida, neron, jhon]
- reverse list :[peida, neron, jhon, jerry, harry, eva]
- isOrdered list :false
- isOrdered list :false
- add null list:[peida, jerry, harry, eva, jhon, neron, null]
- nullsFirst list :[null, eva, harry, jerry, jhon, neron, peida]
- nullsLast list :[eva, harry, jerry, jhon, neron, peida, null]
Guava学习笔记:Ordering犀利的比较器的更多相关文章
- Guava API学习之Ordering犀利的比较器 编辑
Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易扩展,可以轻松构造复杂的comparator,然后用在 ...
- guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用
guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...
- Guava学习笔记目录
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...
- guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...
- Guava学习笔记(4):Ordering犀利的比较器
转自:http://www.cnblogs.com/peida/p/Guava_Ordering.html Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering ...
- Ordering犀利的比较器
Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易扩展,可以轻松构造复杂的comparator,然后用在 ...
- Guava学习笔记(一)概览
Guava是谷歌开源的一套Java开发类库,以简洁的编程风格著称,提供了很多实用的工具类, 在之前的工作中应用过Collections API和Guava提供的Cache,不过对Guava没有一个系统 ...
- Guava学习笔记:Google Guava 类库简介
http://www.cnblogs.com/peida/tag/Guava/ Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, cachin ...
- guava 学习笔记 瓜娃(guava)的API快速熟悉使用
1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...
随机推荐
- iOS-数据持久化-属性列表
属性列表 属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfF ...
- SDWebImage清除图片缓存
背景: 使用 SDWebImage 库,由于内存中一直缓存着加载的图片,而导致内存过高(我们无法手动管理内存),弹出内存警告而导致程序很卡或者直接crash掉. 我的解决方法: 在AppDelegat ...
- java中同步嵌套引起的死锁事例代码
/* 目的:自己写一个由于同步嵌套引起的死锁! 思路:多个线程在执行时,某一时刻,0-Thread绑定了LockA锁,1-Thread绑定了LockB锁! 当0-Thread要去绑定LockB锁时 和 ...
- 邻接表有向图(三)之 Java详解
前面分别介绍了邻接表有向图的C和C++实现,本文通过Java实现邻接表有向图. 目录 1. 邻接表有向图的介绍 2. 邻接表有向图的代码说明 3. 邻接表有向图的完整源码 转载请注明出处:http:/ ...
- 解决Myeclipse下Debug出现Source not found以及sql server中导入数据报错
前言:在空间里回顾了我的2014,从生活.技术.家庭等各方面对自己进行总结剖析,也是给自己一个交代.也想在博客上专门写一篇2014年度菜鸟的技术路回忆录,但是因为各种事一再耽搁了,现在来写也就更显得不 ...
- Android中include标签的使用
在Android的开发中,我们知道布局文件可以让我们很方便的对各个UI控件进行位置安排跟属性设置,而在程序中可以直接取得控件并赋予对应操作功能.但是,如果是一个复杂的界面设计,我们把所有布局都放在一个 ...
- ansible入门
前言 最近看了一下ansible,挺火的一个配置管理工具,对比老大哥puppet,使用起来要简单一些,并且可以批量执行命令,对比同是python语言编写的saltstack,不需要安装客户端(基于pa ...
- Moon转告给你一个比Log4net更好日志框架--TracerX Logger 及其对应的日志查看器
一.介绍 TracerX logger是一个易于上手,且拥有众多高级特性的.NET日志框架. 它能够发送输出结果到多目的地(循环文件.事件日志等....).它也能生成文本和二进制文件.它拥有一个强大的 ...
- iOS宏定义的使用与规范
宏定义在很多方面都会使用,例如定义高度.判断iOS系统.工具类,还有诸如文件路径.服务端api接口文档.为了对宏能够快速定位和了解其功能,我们最好在定义的时候将其放入特定的头文件中 定义尺寸类的宏 D ...
- php的<?php ?>标签匹配
在公司实习了没有多久就开始和同事发现了一个问题,就是之前的人写过的项目经常莫名其妙的出错,仔细的看项目的源代码的时候发现项目中并没有逻辑上的错误,而且各种关系以及数据都没有问题,这是为什么呢.再次认真 ...