对传入的字段序列计算出合理的、顺序敏感的散列值
Objects.hashCode(field1,field2,field3...)从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器
官方排序
natural() //对可排序类型做自然排序,如数字按大小,日期按先后排序 usingToString() //按对象的字符串形式做字典排序 from(Comparator) //把给定的Comparator转化为排序器自定义排序
//直接继承Ordering Ordering<String> strLenthSort = new Ordering<String>() { public int compare(String left, String right) { return Ints.compare(left.length(), right.length()); } };链式调用方法
通过链式调用,可以由给定的排序器衍生出其它排序器
reverse() //获取语义相反的排序器 nullsFirst() //使用当前排序器,但额外把null值排到最前面 nullsLast() //使用当前排序器,但额外把null值排到最后面 compound(Comparator) //合成另一个比较器,以处理当前排序器中的相等情况 lexicographical() //基于处理类型T的排序器,返回该类型的可迭代对象Iterable<T>的排序器 onResultOf(Function) //对集合中元素调用Function,再按返回值用当前排序器排序 //需要下面这个类的排序器 class MyObject{ @Nullable String sorted; int notSortedBy; } //考虑到排序器应该能处理sortedBy为null的情况 Ordering<MyObject> ordering = Ordering .natural() //自然排序 .nullsFirst() //空值优先 .onResultOf( new Function<MyObject, String>() { public String apply(MyObject foo) { return foo.sorted; } });注:链式调用产生的排序器时,应该从后往前读。
排序器首先调用apply方法获取sorted值,并把sorted为null的元素都放到最前面,然后把剩下的元素按sorted进行自然排序。之所以要从后往前读,是因为每次链式调用都是用后面的方法包装了前面的排序器
注:用compound方法包装排序器时,就不应遵循从后往前读的原则。为了避免理解上的混乱,请不要把compound写在一长串链式调用的中间,你可以另起一行,在链中最先或最后调用compound。
Guava的排序器实现有若干操纵集合或元素值的API
greatestOf(Iterable iterable, int k) //获取可迭代对象中最大的k个元素 isOrdered(Iterable) //判断可迭代对象是否已按排序器排序:允许有排序值相等的元素。 sortedCopy(Iterable)//判断可迭代对象是否已严格按排序器排序:不允许排序值相等的元素 greatestOf(Iterable iterable, int k)//获取可迭代对象中最大的k个元素 isOrdered(Iterable) //判断可迭代对象是否已按排序器排序:允许有排序值相等的元素 sortedCopy(Iterable)//判断可迭代对象是否已严格按排序器排序:不允许排序值相等的元素 min(E, E) //返回两个参数中最小的那个。如果相等,则返回第一个参数 min(E, E, E, E...)//返回多个参数中最小的那个。如果有超过一个参数都最小,则返回第一个最小的参数 min(Iterable) //返回迭代器中最小的元素。如果可迭代对象中没有元素,则抛出NoSuchElementException