guava的collection包里有个Ordering
抽象类实现了java.util.Comparator
接口
Comparator
就俩方法int compare(T o1, T o2);
和boolean equals(Object obj);
Ordering
提供了更多的方法来完成集合排序的功能
Ordering<C> natural()
: 返回自然顺序的比较器, 如数字按大小,日期按先后Ordering<T> from(Comparator<T> comparator)
: 把给定的Comparator转化为排序器Ordering<Object> usingToString()
: 按对象的字符串形式做字典排序Ordering<T> compound(Iterable comparators)
: 合成多个比较器, 类似于实例方法的那个Ordering<Object> allEqual()
: 返回一个认为全都相等的比较器, 相当于没有排序.
它的意义在于返回一个比较器, 这样就可以使用一些实例方法了, 从而进行链式比较,
比如:Ordering.allEqual().nullsLast().sortedCopy(asList(t, null, e, s, null, t, null))}
Ordering<S> reverse()
: 返回反序比较器Ordering<S> nullsFirst()
: 使用当前排序器, 但额外把null
放到最前面Ordering<S> nullsLast()
: 使用当前排序器, 但额外把null
放到最后面Ordering<U> compound(Comparator second)
: 合成比较器, 先按原来排序,然后按second排序Ordering<F> onResultOf(Function<F, T> function)
: 对集合中元素调用Function,再按返回值用当前排序器排序.看下面这个链式调用的例子, 应该从后往前读, 先调用apply方法获取Foo的name值, 在把null放前面, 再对剩下的按照name的自然顺序进行排序
Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Foo, String>() {
public String apply(Foo foo) {
return foo.getName;
}
});
注:后面说的大小是指排序的前后
min()
: 返回最小的那个元素, 重载方法有
E min(Iterator<E> iterator)
: 迭代器空则抛出NoSuchElementException
E min(Iterable<E> iterable)
E min(E a, E b)
: 相等则返回第一个E min(E a, E b, E c, E... rest)
: 多个最小则返回第一个最小的max()
: 返回最大的那个元素, 重载方法有
E max(Iterator<E> iterator)
E max(Iterable<E> iterable)
E max(E a, E b)
E max(E a, E b, E c, E... rest)
leastOf()
: 返回最小的k个元素的列表, 不足k个则都返回
List<E> leastOf(Iterable<E> iterable, int k)
List<E> leastOf(Iterator<E> elements, int k)
greatestOf()
: 返回最大的k个元素的列表, 不足k个则都返回
List<E> greatestOf(Iterable<E> iterable, int k)
List<E> greatestOf(Iterator<E> elements, int k)
判断是否已经按照排序器排过序
boolean isOrdered(Iterable iterable)
: 允许有排序值相等的元素boolean isStrictlyOrdered(Iterable iterable)
: 严格递增, 不允许有相等的返回排序好的list
List<E> sortedCopy(Iterable<E> elements)
: 返回可变的已经排好序的listImmutableList<E> immutableSortedCopy(Iterable<E> elements)
: 返回不可变的已经排好序的list