标准API中是否存在自然比较器?
我需要一个比较器作为策略模式的一部分,可以使用对象的自然sorting或一些自定义sorting。 对于自然sorting情况,我写了一个简单的比较器:
private static class NaturalComparator<T extends Comparable<? super T>> implements Comparator<T> { @Override public int compare(T o1, T o2) { return o1.compareTo(o2); } }
似乎很简单,但我想知道是否有人知道标准API中的一个。 我看了一下TreeMap,没有这样的类,所以当编写代码的时候,显然的答案是否定的,但也许以后再添加。
在Java 8中添加到比较器中 :
static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
像这样使用它,例如:
Comparator<Double> natural = Comparator.<Double>naturalOrder(); return natural.compare(1.0, 1.1));
是的,JDK肯定有它! 这里是:
Collections.reverseOrder(Collections.reverseOrder())
开玩笑。 (但是这是真的(只是不要使用它)(永远)))
JDK没有它,但是它被称为ComparableComparator ,它存在于许多框架中,比如Spring , Apache Commons , Hibernate和其他许多框架
我并不熟悉Java中的默认比较器,但显然,比较器compareTo往往只是一个包装器。
标准API中没有“自然顺序”的一般性规定,尽pipe某些内置的types(比如数字)有一个compareTo的实现,然后成为它们的自然顺序。
TreeMap
和TreeSet
,如果你放入的对象没有实现Comparable,所有这些都会抛出一个RuntimeExceptionexception。 因此,例如,你可以扔string或数字,而不是另一个集合。
如果没有可用的TreeMap
的代码不使用比较器 – 它使用compareTo
代替。 要使用compareTo
,它将转换为Comparable
,这是exception的来源。
private int compare(K k1, K k2) { return (comparator==null ? ((Comparable <K>)k1).compareTo(k2) : comparator.compare((K)k1, (K)k2)); }
我认为如果一个类有一个自然的sorting,那么在Java中实现Comparable
更为常见,而不是每个类都有一个Comparator
实现。
因此,如果所讨论的对象具有已定义的自然顺序,则它们必须实现Comparable
并且已经定义了compareTo
方法。 没有必要去找一个Comparator
。 如果没有指定其他顺序,只要在对象上调用compareTo
就可以了,java.util中的大多数类都带有可选的Comparator
。
所以,长话短说:实现Comparable
只要你想强加一个类的自然顺序,只需要使用Comparator
当你想要的东西以外的自然顺序。