В чем разница между Comparable и Comparator?

163
08 января 2022, 19:40

Получается, это дублирующие друг друга вещи. Может, есть какие-то реальные различия?

Answer 1
  1. Comparator и Comparable - это оба интерфейсы
  2. Коллекция (ну хорошо, объект) является Comparable, когда объект может быть как то сравнен с другим объектом.
  3. Comparator, в отличие от этого — это способ сравнения объектов.

Пример: школьники на уроке физкультуры, физрук говорит: строиться по росту! - ученики быстренько сравнивают свои росты и строятся - кто выше вперед, кто ниже в хвост строя - это пример реализации Comparable, где в качестве compareTo(сосед) используется рост учеников.

Второй пример: те же школьники. Директор дает задание учителю математики сравнить учеников по успеваемости. Математичка берет журнал и сравнивает учеников по успеваемости - здесь работает compare(ученик1, ученик2) - Comparator'ом выступает математичка. Аналогично компаратором может выступить русичка или трудовик.

Answer 2

С философской точки зрения Comparator является субъектом - индивидом познающим внешний мир, сравнивая объекты.

А Comparable является объектом, т.е. на него направлена познавательная деятельность субъекта. И одновременно он сам является субъектом, который пытается познать другой объект, сравнивая его с самим собой.

Answer 3

Принципиальное различие в том, что в Comparable "зашит" один-единственный алгоритм сравнения объектов, в то время как Comparator представляет собой внешнюю заменяемую настройку.

Архитектурно, Comparable - это интерфейс значения, в то время как Comparator - настройка контейнера.

Следует использовать Comparable в том случае, когда задается естественный (наиболее логичный) порядок. Например, для строк это регистрозависимое лексикографическое сравнение, а для длинных чисел - сравнение по значению.

Во всех остальных случаях - без отдельного компаратора не обойтись.

Answer 4

Comparable - имплементится самим классом, когда нужен натуральный порядок сортировки. Пример - класс String.

Comparator - имплементится другими классами. Дает возможность отделить реализацию сравнения от класса и сделать несколько реализаций сравнения по разным параметрам для одного класса.

Comparable              Comparator
Package              java.lang               java.util
Functional Interface Yes                    Yes
Method                int o1.compareTo(o2)    int comparator.compare(o1, o2)
-1 if                o1 < o2                 Same
1 if                  o1 > o2                 Same
0 if                  o1 == o2               Same
Implement            Class itself           Separate classes
Defines              Natural ordering       Sorting by different parameters
Examples              String, Date, Wrappers For third-party classes
READ ALSO
Повторить строку несколько раз

Повторить строку несколько раз

В общем есть один метод, который принимает два параметра, например метод

141
Сравнение объектов класса

Сравнение объектов класса

подскажите имеется объект определенного класса содержащий Map<String,DefaultTableModel> подскажите каким образом можно сравнить два таких объекта,...

163
Получить следующую и предыдущую неделю в календаре

Получить следующую и предыдущую неделю в календаре

Есть активити с двумя кнопками Prev и Next и TextView

166