标准API中是否存在自然比较器?

时间:2010-07-13 20:09:45

标签: java comparator comparable

我需要一个比较器作为策略模式的一部分,可以使用对象的自然顺序或一些自定义顺序。对于自然排序的情况,我写了一个简单的比较器:

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,它没有这样的类,所以当编写代码时,明显的答案是否定的,但也许稍后会添加。

5 个答案:

答案 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 ,它存在于许多框架中,例如SpringApache CommonsHibernate和许多其他框架< / p>

答案 3 :(得分:2)

我不熟悉Java中的默认比较器,但很明显,比较器的比较器通常只是一个包装器。

标准API中没有“自然排序”的一般性,尽管某些内置类型(如数字)具有compareTo的实现,然后它们成为它们的自然顺序。

TreeMapTreeSet如果您输入的对象未实现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