Получается, это дублирующие друг друга вещи. Может, есть какие-то реальные различия?
Comparator
и Comparable
- это оба интерфейсыComparable
, когда объект может быть как то сравнен с другим объектом.Comparator
, в отличие от этого — это способ сравнения объектов.Пример: школьники на уроке физкультуры, физрук говорит: строиться по росту! - ученики быстренько сравнивают свои росты и строятся - кто выше вперед, кто ниже в хвост строя - это пример реализации Comparable
, где в качестве compareTo(сосед)
используется рост учеников.
Второй пример: те же школьники. Директор дает задание учителю математики сравнить учеников по успеваемости. Математичка берет журнал и сравнивает учеников по успеваемости - здесь работает compare(ученик1, ученик2)
- Comparator'ом
выступает математичка. Аналогично компаратором может выступить русичка или трудовик.
С философской точки зрения Comparator является субъектом - индивидом познающим внешний мир, сравнивая объекты.
А Comparable является объектом, т.е. на него направлена познавательная деятельность субъекта. И одновременно он сам является субъектом, который пытается познать другой объект, сравнивая его с самим собой.
Принципиальное различие в том, что в Comparable "зашит" один-единственный алгоритм сравнения объектов, в то время как Comparator представляет собой внешнюю заменяемую настройку.
Архитектурно, Comparable - это интерфейс значения, в то время как Comparator - настройка контейнера.
Следует использовать Comparable в том случае, когда задается естественный (наиболее логичный) порядок. Например, для строк это регистрозависимое лексикографическое сравнение, а для длинных чисел - сравнение по значению.
Во всех остальных случаях - без отдельного компаратора не обойтись.
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 |
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В общем есть один метод, который принимает два параметра, например метод
подскажите имеется объект определенного класса содержащий Map<String,DefaultTableModel> подскажите каким образом можно сравнить два таких объекта,...
Есть активити с двумя кнопками Prev и Next и TextView