Я видел классы, которые реализуют как Сопоставимые, так и Компаратор. Что это значит? Почему я должен использовать один над другим?
Когда класс должен быть сравнимым и/или компаратором?
Ответ 1
Текст ниже представлен Сравнение с сопоставимым
Сопоставимые
Сопоставимый объект способен сравнивать себя с другим объектом. Сам класс должен реализовывать интерфейс java.lang.Comparable
, чтобы иметь возможность сравнивать его экземпляры.
Компаратор
Объект компаратора способен сравнивать два разных объекта. Класс не сравнивает свои экземпляры, а некоторые экземпляры других классов. Этот класс компаратора должен реализовывать интерфейс java.util.Comparator
.
Ответ 2
Реализация Comparable
означает " я могу сравнивать себя с другим объектом". Это обычно полезно, когда есть единственное естественное сравнение по умолчанию.
Внедрение Comparator
означает " я могу сравнить два других объекта". Это обычно полезно, когда есть несколько способов сравнения двух экземпляров типа - например, вы можете сравнивать людей по возрасту, имени и т.д.
Ответ 3
Comparable позволяет классу реализовать свое собственное сравнение:
- он в тот же класс (это часто является преимуществом)
- может быть только одна реализация (поэтому вы не можете использовать это, если хотите два разных случая)
Для сравнения, компаратор является внешним сравнением:
- он обычно находится в уникальном экземпляре (либо в том же классе, либо в другом месте).
- вы назовите каждую реализацию тем, как вы хотите сортировать вещи
- вы можете предоставить компараторы для классов, которые вы не контролируете
- реализация применима, даже если первый объект имеет значение null
В обеих реализациях вы все еще можете выбрать то, что хотите сравнить. С помощью дженериков вы можете объявить это и проверить его во время компиляции. Это повышает безопасность, но также сложно определить соответствующую ценность.
Как правило, я обычно использую самый общий класс или интерфейс, с которым можно сравнить этот объект, во всех случаях использования, которые я себе представляю... Не очень точное определение, хотя!: - (
-
Comparable<Object>
позволяет использовать его во всех кодах во время компиляции (что хорошо, если необходимо, или плохо, если нет, и вы теряете ошибку времени компиляции); ваша реализация должна справляться с объектами и применять при необходимости, но надежным способом. -
Comparable<Itself>
очень строгий, наоборот.
Смешно, когда вы подклассифицируете себя подклассом, Подкласс также должен быть сопоставим и быть уверенным в этом (или он нарушит принцип Лискова и даст вам ошибки времени выполнения).
Ответ 4
java.lang.Comparable
-
Чтобы реализовать интерфейс
Comparable
, класс должен реализовать один методcompareTo()
int a.compareTo(b)
-
Вы должны изменить класс, экземпляр которого вы хотите отсортировать. Так что для каждого класса может быть создана только одна последовательность сортировки.
java.util.Comparator
-
Для реализации интерфейса Comparator класс должен реализовать один метод
compare()
int compare (a,b)
- Вы создаете класс отдельно от класса, экземпляр которого вы хотите сортировать. Так что для каждого класса можно создать несколько порядков сортировки.
Ответ 5
Comparable
предназначен для предоставления заказа по умолчанию для объектов данных, например, если объекты данных имеют естественный порядок.
A Comparator
представляет собой упорядочение для конкретного использования.
Ответ 6
Comparable
обычно является предпочтительным. Но иногда класс уже реализует Comparable
, но вы хотите отсортировать его по другому свойству. Затем вы вынуждены использовать Comparator
.
Некоторые классы фактически предоставляют Comparators
для обычных случаев; например, String
по умолчанию чувствительны к регистру при сортировке, но есть также статический Comparator
, называемый CASE_INSENSITIVE_ORDER
.
Ответ 7
здесь немного различий между компаратором и сравнимым я нашел в Интернете:
-
Если вы видите, что логическая разница между этими двумя является Comparator в Java, сравнивайте два предоставленных ему объекта, а интерфейс Comparable сравнивает ссылку "this" с указанным объектом.
-
Сопоставимый в Java используется для реализации естественного упорядочения объекта. В Java API String классы Date и wrapper реализуют интерфейс Comparable.
-
Если какой-либо класс реализует интерфейс Comparable в Java, то сбор этого объекта либо List, либо Array может быть отсортирован автоматически с помощью метода Collections.sort() или Array.sort(), и объект будет отсортирован на основе естественного порядок, определенный методом CompareTo.
-
Объекты, реализующие Comparable в Java, могут использоваться как ключи в сортированной карте или элементы в отсортированном наборе, например TreeSet, без указания какого-либо компаратора.
site: Как использовать Comparator и Comparable в Java? Пример
Подробнее: Как использовать Comparator и Comparable в Java? Пример
Ответ 8
Comparable
предназначен для объектов с естественным упорядочением. Сам объект знает, как его заказывать. Comparator
предназначен для объектов без естественного порядка или когда вы хотите использовать другой порядок.
Ответ 9
Разница между интерфейсами Comparator и Comparable
Comparable
используется для сравнения себя с использованием другого объекта.
Comparator
используется для сравнения двух типов данных - это объекты.
Ответ 10
Если вы видите, то логическая разница между этими двумя Comparator
в Java сравнивает два объекта, предоставленные ему, а интерфейс Comparable
сравнивает ссылку "this" с указанным объектом.
Comparable
в Java используется для реализации естественного упорядочения объекта. В Java API String классы Date и wrapper реализуют интерфейс Comparable
.
Если какой-либо класс реализует интерфейс Comparable
в Java, тогда сбор этого объекта либо List
, либо Array
может быть отсортирован автоматически с помощью метода Collections.sort()
или Array.sort()
, и объект будет отсортирован на основе естественного порядка определяемый методом compareTo
.
Объекты, реализующие Comparable
в Java, могут использоваться как ключи в сортированной карте или элементы в отсортированном наборе, например TreeSet
, без указания каких-либо Comparator
.
Ответ 11
Моя аннотация lib для реализации 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