Существует ли естественный компаратор в стандартном API? - PullRequest
54 голосов
/ 14 июля 2010

Мне нужен компаратор как часть шаблона стратегии, который может использовать естественное упорядочение объектов или произвольное упорядочение. Для случая естественного упорядочения я написал простой компаратор:

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 ]

62 голосов
/ 04 ноября 2013

Добавлено в Компаратор в Java 8 :

static <T extends Comparable<? super T>> Comparator<T> naturalOrder()

Используйте его следующим образом, например:

Comparator<Double> natural = Comparator.<Double>naturalOrder();
return natural.compare(1.0, 1.1));
50 голосов
/ 14 июля 2010

Да, JDK определенно имеет это!Вот оно:

Collections.reverseOrder(Collections.reverseOrder())

Шучу.(Но это правда. (Только на самом деле не используйте это. (Всегда).))

10 голосов
/ 14 июля 2010

JDK не имеет его, однако он называется ComparableComparator и существует во многих средах, таких как Spring , Apache Commons , Hibernate и многие другие

2 голосов
/ 14 июля 2010

Я думаю, что если у класса есть естественный порядок, в Java более привычно реализовывать Comparable, а не иметь реализацию Comparator для каждого класса.

Таким образом, если объекты ввопрос имеет естественный порядок, они должны реализовывать Comparable и иметь метод compareTo.Не нужно искать Comparator.Большинство классов в java.util принимают либо необязательный Comparator, если существует какой-то определенный порядок, либо просто пытаются вызвать compareTo для объектов, если не указан другой порядок.

Итак,Короче говоря: Реализуйте Comparable всякий раз, когда вы хотите наложить естественное упорядочение на класс, используйте Comparator, только когда вы хотите что-то отличное от естественного упорядочения.

2 голосов
/ 14 июля 2010

Я не знаком с компаратором по умолчанию в Java, но очевидно, что Comparator для сравнения часто является просто оболочкой.

В стандартном API нет общего понятия «естественного упорядочения», хотя некоторые встроенные типы, такие как числа, имеют реализацию CompareTo, которая затем становится их естественным упорядочением.

TreeMap и TreeSet, и все это должно вызвать исключение RuntimeException, если объект, который вы вставляете, не реализует Comparable.Таким образом, например, вы можете добавить строки или числа, но не другую коллекцию.

Код 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));
  }
...