Я видел классы, которые реализуют как Comparable, так и Comparator . Что это значит? Почему я должен использовать одно вместо другого?
java
comparator
comparable
Ник Хайнер
источник
источник
Ответы:
Текст ниже взят из Comparator vs Comparable
Сопоставимый
Сравнимый объект может сравнивать себя с другим объектом. Сам класс должен реализовывать
java.lang.Comparable
интерфейс, чтобы иметь возможность сравнивать его экземпляры.Компаратор
Объект-компаратор может сравнивать два разных объекта. Класс сравнивает не свои экземпляры, а экземпляры некоторых других классов. Этот класс компаратора должен реализовывать
java.util.Comparator
интерфейс.источник
Реализация
Comparable
означает « Я могу сравнить себя с другим объектом ». Обычно это полезно, когда есть единственное естественное сравнение по умолчанию.Реализация
Comparator
означает « Я могу сравнить два других объекта». Это обычно полезно, когда есть несколько способов сравнения двух экземпляров типа - например, вы можете сравнивать людей по возрасту, имени и т. Д.источник
Person
орудиеComparable
, потому что тогда вы не сможете изменить способ сравнения двух людей.Person
. 2) Компаратор, например,PersonAgeComparator
который может сравнивать два разных объекта и решать, что должно быть первым в этом конкретном порядке сортировки. 3) Код сортировки, который принимает набор сущностей и компаратор и сортирует эту коллекцию, используя компаратор для определения порядка.Comparable позволяет классу реализовывать собственное сравнение:
Для сравнения, Comparator - это внешнее сравнение:
В обеих реализациях вы по-прежнему можете выбирать, с чем вы хотите сравнивать . С помощью дженериков вы можете объявить это и проверить это во время компиляции. Это повышает безопасность, но также сложно определить подходящее значение.
В качестве ориентира я обычно использую самый общий класс или интерфейс, с которым можно было бы сравнить этот объект, во всех возможных вариантах использования ... Хотя не очень точное определение! :-(
Comparable<Object>
позволяет использовать его во всех кодах во время компиляции (что хорошо, если необходимо, или плохо, если нет, и вы теряете ошибку времени компиляции); ваша реализация должна справляться с объектами и приводиться по мере необходимости, но надежно.Comparable<Itself>
очень строгий наоборот.источник
java.lang.Comparable
Чтобы реализовать
Comparable
интерфейс, класс должен реализовывать единственный методcompareTo()
int a.compareTo(b)
Вы должны изменить класс, экземпляр которого вы хотите отсортировать. Таким образом, для каждого класса может быть создана только одна последовательность сортировки.
java.util.Comparator
Чтобы реализовать интерфейс Comparator, класс должен реализовывать единственный метод
compare()
int compare (a,b)
источник
Comparable
предназначен для обеспечения порядка по умолчанию для объектов данных, например, если объекты данных имеют естественный порядок.A
Comparator
представляет собой заказ для конкретного использования.источник
Comparable
обычно предпочтительнее. Но иногда класс уже реализуетсяComparable
, но вы хотите отсортировать по другому свойству. Тогда вы будете вынуждены использоватьComparator
.Некоторые классы действительно предусматривают
Comparators
общие случаи; например,String
s по умолчанию чувствительны к регистру при сортировке, но есть также статическийComparator
вызовCASE_INSENSITIVE_ORDER
.источник
Вот несколько различий между Comparator и Comparable, которые я нашел в Интернете:
Если вы видите, то логическая разница между этими двумя: Comparator в Java сравнивает два предоставленных ему объекта, в то время как интерфейс Comparable сравнивает «эту» ссылку с указанным объектом.
Comparable в Java используется для реализации естественного упорядочивания объектов. В Java API String, Date и классы оболочки реализуют интерфейс Comparable.
Если какой-либо класс реализует интерфейс Comparable в Java, тогда коллекция этого объекта List или Array может быть автоматически отсортирована с помощью метода Collections.sort () или Array.sort (), и объект будет отсортирован на основе естественного порядка, определенного методом CompareTo.
Объекты, которые реализуют Comparable в Java, могут использоваться как ключи в отсортированной карте или элементы в отсортированном наборе, например TreeSet, без указания какого-либо Comparator.
сайт: Как использовать Comparator и Comparable в Java? С примером
Подробнее: Как использовать Comparator и Comparable в Java? С примером
источник
Comparable
для объектов с естественным упорядочением. Сам объект знает, как его нужно заказывать.Comparator
предназначен для объектов без естественного порядка или когда вы хотите использовать другой порядок.источник
Разница между интерфейсами Comparator и Comparable
Comparable
используется для сравнения себя с другим объектом.Comparator
используется для сравнения двух типов данных - объектов.источник
Если вы видите, то логическая разница между этими двумя заключается
Comparator
в том, что в Java сравниваются два предоставленных ему объекта, аComparable
интерфейс сравнивает «эту» ссылку с указанным объектом.Comparable
в Java используется для реализации естественного упорядочивания объекта. В Java API String, Date и классы оболочки реализуютComparable
интерфейс.Если какой - либо класс реализации
Comparable
интерфейса в Java , то сбор этого объекта либоList
илиArray
может быть отсортирован автоматически, используяCollections.sort()
илиArray.sort()
метод и объект будет отсортирован на основе там естественном порядке , определенномcompareTo
методом.Объекты, которые реализованы
Comparable
в Java, могут использоваться как ключи в отсортированной карте или элементы в отсортированном наборе, напримерTreeSet
, без указания каких-либоComparator
.источник
Моя аннотационная библиотека для реализации Comparable и Comparator:
public class Person implements Comparable<Person> { private String firstName; private String lastName; private int age; private char gentle; @Override @CompaProperties({ @CompaProperty(property = "lastName"), @CompaProperty(property = "age", order = Order.DSC) }) public int compareTo(Person person) { return Compamatic.doComparasion(this, person); } }
Щелкните ссылку, чтобы увидеть больше примеров. компаматичный
источник