When should a class be Comparable and/or Comparator?
I have seen classes which implement both Comparable and Comparator. Что это значит? Зачем мне использовать один над другим?
11 ответов
Текст ниже взят из Comparator vs Comparable
сравнимый
Сопоставимый объект способен сравнивать себя с другим объектом. Сам класс должен реализовывать java.lang.Comparable
интерфейс для того, чтобы иметь возможность сравнить его экземпляры.
компаратор
Объект сравнения способен сравнивать два разных объекта. Класс сравнивает не свои экземпляры, а экземпляры некоторых других классов. Этот класс компаратора должен реализовывать java.util.Comparator
интерфейс.
Внедрение Comparable
означает "я могу сравнить себя с другим объектом". Это обычно полезно, когда есть единственное естественное сравнение по умолчанию.
Внедрение Comparator
означает "Я могу сравнить два других объекта". Это обычно полезно, когда есть несколько способов сравнения двух экземпляров типа - например, вы можете сравнивать людей по возрасту, имени и т. Д.
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
предназначен для обеспечения порядка по умолчанию для объектов данных, например, если объекты данных имеют естественный порядок.
Comparator
представляет собой заказ для конкретного использования.
Comparable
обычно предпочтительнее. Но иногда класс уже реализует Comparable
, но вы хотите отсортировать по другому свойству. Тогда вы вынуждены использовать Comparator
,
Некоторые классы на самом деле предоставляют Comparators
для общих случаев; например, String
s по умолчанию чувствительны к регистру при сортировке, но есть и статический Comparator
называется CASE_INSENSITIVE_ORDER
,
Вот несколько различий между Comparator и Comparable, которые я нашел в Интернете:
Если вы видите, что логическое различие между этими двумя аспектами заключается в том, что Comparator в Java сравнивает два предоставленных ему объекта, тогда как интерфейс Comparable сравнивает ссылку "this" с указанным объектом.
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
Интерфейс сравнивает ссылку "this" с указанным объектом.
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