Я видел классы, которые реализуют как Comparable, так и Comparator. Что это значит? Почему я должен использовать одно вместо другого?
Когда класс должен быть Comparable и / или Comparator?
Ответы (11)
Текст ниже взят из Comparator vs Comparable.
Сопоставимо
Сравнимый объект может сравнивать себя с другим объектом. Сам класс должен реализовывать интерфейс java.lang.Comparable
, чтобы иметь возможность сравнивать его экземпляры.
Компаратор
Объект компаратора может сравнивать два разных объекта. Класс сравнивает не свои экземпляры, а экземпляры некоторых других классов. Этот класс компаратора должен реализовывать интерфейс java.util.Comparator
.
Реализация Comparable
означает «Я могу сравнить себя с другим объектом». Обычно это полезно, когда есть одно естественное сравнение по умолчанию.
Реализация Comparator
означает «Я могу сравнить два других объекта». Обычно это полезно, когда есть несколько способов сравнения двух экземпляров типа, например вы можете сравнивать людей по возрасту, имени и т. д.
Comparator
, не может быть легко реализован Comparable
? Я не вижу большой разницы между ними
- person Alireza Farahani; 30.06.2014
Person
реализовать Comparable
, потому что вы не можете затем изменить способ сравнения двух людей.
- person Jon Skeet; 30.06.2014
Person
. 2) Компаратор, например PersonAgeComparator
, который может сравнивать две разные сущности и решать, какая из них должна быть первой в этом конкретном порядке сортировки. 3) Код сортировки, который принимает набор сущностей и компаратор и сортирует эту коллекцию, используя компаратор для определения порядка.
- person Jon Skeet; 11.08.2014
Comparable позволяет классу реализовать собственное сравнение:
- он относится к тому же классу (часто это является преимуществом)
- может быть только одна реализация (поэтому вы не можете использовать ее, если вам нужны два разных случая)
Для сравнения, Comparator - это внешнее сравнение:
- обычно он находится в уникальном экземпляре (либо в том же классе, либо в другом месте)
- вы называете каждую реализацию так, как хотите
- вы можете предоставить компараторы для классов, которые вы не контролируете
- реализация пригодна для использования, даже если первый объект имеет значение NULL
В обеих реализациях вы по-прежнему можете выбрать то, что вы хотите сравнить. С помощью дженериков вы можете объявить это и проверить это во время компиляции. Это повышает безопасность, но также сложно определить подходящее значение.
В качестве ориентира я обычно использую самый общий класс или интерфейс, с которым можно было бы сравнить этот объект, во всех возможных вариантах использования ... Хотя не очень точное определение! :-(
Comparable<Object>
позволяет использовать его во всех кодах во время компиляции (что хорошо, если необходимо, или плохо, если нет, и вы теряете ошибку времени компиляции); ваша реализация должна справляться с объектами и приводиться по мере необходимости, но надежно.Comparable<Itself>
наоборот очень строгий.
Забавно, когда вы подклассифицируете себя к подклассу, подкласс также должен быть сопоставимым и устойчивым к нему (иначе это нарушит принцип Лискова и даст вам ошибки во время выполнения).
java.lang.Comparable
Чтобы реализовать интерфейс
Comparable
, класс должен реализовать единственный методcompareTo()
int a.compareTo(b)
Вы должны изменить класс, экземпляр которого вы хотите отсортировать. Таким образом, для каждого класса может быть создана только одна последовательность сортировки.
java.util.Comparator
Чтобы реализовать интерфейс Comparator, класс должен реализовывать единственный метод
compare()
int compare (a,b)
- Вы создаете класс отдельно от класса, экземпляр которого вы хотите отсортировать. Так что для каждого класса можно создать несколько последовательностей сортировки.
Comparable
предназначен для обеспечения порядка по умолчанию для объектов данных, например, если объекты данных имеют естественный порядок.
Comparator
представляет собой заказ для конкретного использования.
Comparable
обычно предпочтительнее. Но иногда класс уже реализует Comparable
, но вы хотите отсортировать по другому свойству. Тогда вы вынуждены использовать Comparator
.
Некоторые классы фактически предоставляют Comparators
для общих случаев; например, String
по умолчанию -чувствителен при сортировке, но есть также статический 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);
}
}
Щелкните ссылку, чтобы увидеть больше примеров. compamatic