标准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的实现,然后成为它们的自然顺序。

TreeMapTreeSet ,如果你放入的对象没有实现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当你想要的东西以外的自然顺序。