Естественный компаратор существует в стандартном API?

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

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, и он делает это без такого класса, поэтому когда тот код был написан, очевидный ответ будет не, но возможно он был добавлен позже.

54
задан Yishai 13 July 2010 в 09:09
поделиться

4 ответа

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

.
10
ответ дан 7 November 2019 в 07:49
поделиться

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

В стандартном 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));
  }
2
ответ дан 7 November 2019 в 07:49
поделиться

Да, он определенно есть в JDK! Вот он:

Collections.reverseOrder (Collections.reverseOrder ())

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

50
ответ дан 7 November 2019 в 07:49
поделиться

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

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

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

2
ответ дан 7 November 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: