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

404
15 марта 2017, 17:23

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

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 в том случае, когда задается естественный (наиболее логичный) порядок. Например, для строк это регистрозависимое лексикографическое сравнение, а для длинных чисел - сравнение по значению.

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

READ ALSO
Как прочитать файл txt на java

Как прочитать файл txt на java

Есть однострочный txt файл

313
Selenium Drag And Drop не работает на Jenkins

Selenium Drag And Drop не работает на Jenkins

Проблема в следующем: Есть автотест который должен выполнять Drag&Drop элементов в определенном порядкеDrag&Drop реализован в тесте следующим...

327
Как исправить ошибку с mockito?

Как исправить ошибку с mockito?

Добрый деньПри написании тестов, код которых ниже:

394
Как сохранить json в mongodb с помощью spring

Как сохранить json в mongodb с помощью spring

Есть пример кода, как можно его переделать под запись json?

272