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

Yis*_*hai 54 java comparable comparator

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

private static class NaturalComparator<T extends Comparable<? super T>> implements Comparator<T> {
    @Override
    public int compare(T o1, T o2) {
        return o1.compareTo(o2);
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来很简单,但我想知道是否有人知道标准API中的一个.我查看了TreeMap,它没有这样的类,所以当编写代码时,明显的答案是否定的,但也许稍后会添加.

Jul*_*ien 64

在Java 8中添加到Comparator:

static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
Run Code Online (Sandbox Code Playgroud)

像这样使用它,例如:

Comparator<Double> natural = Comparator.<Double>naturalOrder();
return natural.compare(1.0, 1.1));
Run Code Online (Sandbox Code Playgroud)

  • 如果你还没有使用Java 8,并且想要在比较简单的`Arrays.sort()`或`Collections.sort()`中使用Comparator,你可以简单地将`null`传递给Comparator参数,并且它将使用自然顺序.并非所有Comparator的使用都保证以这种方式工作.至少对于`Arrays`和`Collections`来说,它确实有用. (15认同)

Kev*_*ion 50

是的,JDK绝对拥有它!这里是:

Collections.reverseOrder(Collections.reverseOrder())

开玩笑.(但这是真的.(只是不要实际使用它.(永远.)))

  • @JirkaHanika,最重要的是 - 从长远来看 - 你可以做的编码就是让代码易于理解.当然,这是一个很好的单行并且只使用基于API的类,但问题中的代码对于任何中级和高级Java开发人员来说都是明确且明显的.像大多数任何"技巧"一样,这会给任何出现并稍后阅读的人造成混淆. (6认同)
  • 我不接受这个答案,因为它已被Java 8克服,但它是Java 8之前的正确答案.但实际上并没有使用它;-). (5认同)
  • +1最滑稽但最好的答案:) (2认同)

Eug*_*kov 10

JDK没有它,但它被称为ComparableComparator,它存在于许多框架中,如Spring,Apache Commons,Hibernate和许多其他框架

  • 仅供参考,Guava称之为"Ordering.natural()". (18认同)