我需要一个比较器作为策略模式的一部分,可以使用对象的自然顺序或一些自定义顺序。对于自然排序的情况,我写了一个简单的比较器:
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,它没有这样的类,所以当编写代码时,明显的答案是否定的,但也许稍后会添加。
答案 0 :(得分:62)
已添加到Comparator in Java 8:
static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
像这样使用它,例如:
Comparator<Double> natural = Comparator.<Double>naturalOrder();
return natural.compare(1.0, 1.1));
答案 1 :(得分:50)
是的,JDK绝对拥有它!这是:
Collections.reverseOrder(Collections.reverseOrder())
答案 2 :(得分:10)
JDK没有它,但它被称为 ComparableComparator ,它存在于许多框架中,例如Spring,Apache Commons,Hibernate和许多其他框架< / p>
答案 3 :(得分:2)
我不熟悉Java中的默认比较器,但很明显,比较器的比较器通常只是一个包装器。
标准API中没有“自然排序”的一般性,尽管某些内置类型(如数字)具有compareTo的实现,然后它们成为它们的自然顺序。
TreeMap
和TreeSet
如果您输入的对象未实现Comparable,则所有这些都应该抛出RuntimeException。因此,例如,您可以输入字符串或数字而不是其他集合。
TreeMap
的代码如果没有比较器,则不使用比较器 - 而是使用compareTo
。要使用compareTo
,它会转换为Comparable
,这是异常的来源。
private int compare(K k1, K k2) {
return (comparator==null ? ((Comparable <K>)k1).compareTo(k2)
: comparator.compare((K)k1, (K)k2));
}
答案 4 :(得分:2)
我认为如果一个类具有自然顺序,那么在Java中更常见的是它实现Comparable
而不是为每个类实现Comparator
。
因此,如果相关对象定义了自然顺序,则必须实现Comparable
并定义compareTo
方法。无需寻找Comparator
。如果有任何特定的排序,java.util中的大多数类都会选择Comparator
,或者如果没有指定其他排序,只需尝试在对象上调用compareTo
。
所以,长话短说:只要你想在一个类上强加一个自然的顺序,就实现Comparable
,当你想要一些不同于自然顺序的东西时,只使用Comparator
。