У меня есть список объектов, которые мне нужно отсортировать по полю, например Score. Не задумываясь, я написал новый класс, реализующий Comparator, который выполняет задачу и работает.
Теперь, оглядываясь на это, мне интересно, должен ли я вместо этого иметь мой класс, реализующий Comparable, вместо создания нового класса, который реализует Comparator. Оценка - это единственное поле, по которому будут размещаться объекты.
Что я сделал приемлемым на практике?
Правильный ли подход: «Сначала пусть класс реализует Comparable (для естественного порядка), а если требуется альтернативное сравнение полей, затем создайте новый класс, который реализует Comparator»?
Если (2) выше верно, то означает ли это, что нужно реализовать Comparator только после того, как у них есть реализация класса Comparable? (Предполагая, что у меня есть исходный класс).
источник
Используйте,
Comparable
если вы хотите определить поведение упорядочивания по умолчанию (естественное) для рассматриваемого объекта, обычной практикой является использование для этого технического или естественного (база данных?) Идентификатора объекта.Используйте,
Comparator
если вы хотите определить внешнее управляемое поведение упорядочивания, это может переопределить поведение упорядочивания по умолчанию.источник
Comparable
что я определяю естественный порядок?» , это дало мне ответ, который я искал. Спасибо :)Использование
Comparable
:Использование
Comparator
:Comparable
.Comparable
).источник
Сопоставимый -
java.lang.Comparable: int compareTo(Object o1)
Сравнимый объект может сравнивать себя с другим объектом. Сам класс должен реализовывать интерфейс java.lang.Comparable, чтобы иметь возможность сравнивать его экземпляры.
only one sort sequence
на основе свойств экземпляров. EX:Person.id
Компаратор -
java.util.Comparator: int compare(Object o1, Object o2)
Компараторный объект может сравнивать два разных объекта. Класс сравнивает не свои экземпляры, а экземпляры некоторых других классов. Этот класс компаратора должен реализовывать интерфейс java.util.Comparator.
many sort sequence
и назвать каждый в зависимости от свойств экземпляра. EX:Person.id, Person.name, Person.age
Пример:
Для Java 8 Lambda: Comparator см. Мой пост.
источник
Comparable следует использовать при сравнении экземпляров одного и того же класса.
Компаратор можно использовать для сравнения экземпляров разных классов.
Comparable реализуется классом, которому необходимо определить естественный порядок для своих объектов. Подобно String реализует Comparable.
Если кто-то хочет другой порядок сортировки, он может реализовать компаратор и определить свой собственный способ сравнения двух экземпляров.
источник
Если сортировка объектов должна быть основана на естественном порядке, используйте Comparable, тогда как если ваша сортировка должна выполняться по атрибутам разных объектов, используйте Comparator в Java.
Основные различия между Comparable и Comparator:
источник
Компаратор делает все, что делает сопоставимый, плюс многое другое.
Я нашел лучший способ использования компараторов в качестве анонимных классов:
Вы можете создать несколько версий таких методов прямо внутри класса, который планируете сортировать. Итак, вы можете иметь:
sortAccountsByPriorityAndType
и т.д...
Теперь вы можете использовать эти методы сортировки где угодно и получить повторное использование кода. Это дает мне все, что было бы сопоставимо, плюс еще ... так что я не вижу смысла использовать сопоставимые.
источник
Я бы сказал:
источник
Следующие пункты помогут вам решить, в каких ситуациях следует использовать Comparable и в каком Comparator:
1) Наличие кода
2) Единичный критерий сортировки или множественный критерий сортировки
3) Arays.sort () и Collection.sort ()
4) Как ключи в SortedMap и SortedSet
5) Больше количества занятий по сравнению с гибкостью
6) Межклассовые сравнения
7) Естественный порядок
Для получения более подробной информации вы можете обратиться к Когда использовать сопоставимый, а когда использовать компаратор
источник
источник
Если вам нужна естественная сортировка по порядку - сопоставима с пользователем, если вам нужна сортировка по индивидуальному порядку - используйте компаратор
Пример:
Сортировка в естественном порядке будет основана на идентификаторе, поскольку она будет уникальной, а сортировка в произвольном порядке будет осуществляться по имени и отделу.
Ссылки:
Когда класс должен быть Comparable и / или Comparator? http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html
источник
Здесь был аналогичный вопрос: когда класс должен быть Comparable и / или Comparator?
Я бы сказал следующее: реализуйте Comparable для чего-то вроде естественного упорядочения, например, на основе внутреннего идентификатора
Внедрите компаратор, если у вас более сложный алгоритм сравнения, например, несколько полей и так далее.
источник
Comparable
.Сопоставимость:
всякий раз, когда мы хотим хранить только однородные элементы и требуемый естественный порядок сортировки по умолчанию, мы можем использовать
comparable
интерфейс реализации класса .Компаратор:
всякий раз, когда мы хотим хранить однородные и разнородные элементы и хотим выполнить сортировку в настроенном по умолчанию порядке сортировки, мы можем использовать
comparator
интерфейс.источник
Мне нужно было отсортировать по дате.
Итак, я использовал Comparable, и у меня это сработало.
Одним из ограничений Comparable является то, что они не могут использоваться для других коллекций, кроме List.
источник
Если у вас есть класс, лучше выберите Comparable . Обычно Comparator используется, если вы не владеете классом, но вы должны использовать его как TreeSet или TreeMap, потому что Comparator может быть передан как параметр в конструкторе TreeSet или TreeMap. Вы можете увидеть, как использовать Comparator и Comparable в http://preciselyconcise.com/java/collections/g_comparator.php
источник
В одном из интервью меня попросили отсортировать определенный диапазон чисел за лучшее, чем nlogn время. (Без использования подсчетной сортировки)
Реализация интерфейса Comparable над объектом позволяет алгоритмам неявной сортировки использовать переопределенный метод compareTo для упорядочивания элементов сортировки, и это будет линейное время.
источник
Comparable - это естественный порядок сортировки по умолчанию, обеспечиваемый для числовых значений по возрастанию, а для строк - в алфавитном порядке. например:
Компаратор - это настраиваемый порядок сортировки, реализованный в настраиваемом классе myComparator путем переопределения метода сравнения, например:
источник
Очень простой подход состоит в том, чтобы предположить, что рассматриваемый класс сущности будет представлен в базе данных, а затем в таблице базы данных потребуется ли вам индекс, составленный из полей класса сущности? Если ответ положительный, то реализуйте сопоставимость и используйте поле (я) индекса для естественного порядка сортировки. Во всех остальных случаях используйте компаратор.
источник
Моя аннотационная библиотека для реализации
Comparable
иComparator
:Щелкните ссылку, чтобы увидеть больше примеров. http://code.google.com/p/compamatic/wiki/CompamaticByExamples
источник