Когда использовать Comparable и Comparator - PullRequest
103 голосов
/ 15 февраля 2010

У меня есть список объектов, которые мне нужно отсортировать по полю, скажем, Score. Не задумываясь, я написал новый класс, который реализует Comparator, который выполняет задачу, и она работает.

Теперь, оглядываясь назад на это, я задаюсь вопросом, должен ли я вместо этого иметь мой класс, реализующий Comparable, вместо того, чтобы создавать новый класс, который реализует Comparator. Счет - это единственное поле, в котором объекты будут упорядочены.

  1. Что я сделал приемлемым в качестве практики?

  2. Правильный ли подход: «Сначала нужно, чтобы класс реализовал Comparable (для естественного упорядочения), и если требуется альтернативное сравнение полей, то создайте новый класс, который реализует Comparator»?

  3. Если (2) выше верно, то означает ли это, что следует реализовывать Comparator только после того, как класс реализует Comparable? (Предполагая, что мне принадлежит оригинальный класс).

Ответы [ 19 ]

3 голосов
/ 12 октября 2011

Если вам нужна естественная сортировка заказов - пользовательский сопоставимый ЕСЛИ вам нужна сортировка по индивидуальному заказу - используйте компаратор

Пример:

Class Employee{
private int id;
private String name;
private String department;
}

Естественная сортировка по порядку будет основываться на идентификаторе, потому что она будет уникальной, а по порядку сортировки - имя и отдел.

Refrences:
Когда класс должен быть Comparable и / или Comparator? http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html

3 голосов
/ 15 февраля 2010

Здесь был похожий вопрос: Когда класс должен быть Comparable и / или Comparator?

Я бы сказал следующее: Реализуйте Comparable для чего-то вроде естественного упорядочения, например на основании внутреннего идентификатора

Реализуйте Компаратор, если у вас более сложный алгоритм сравнения, например несколько полей и т. д.

2 голосов
/ 12 декабря 2011

Сопоставимые:
Всякий раз, когда мы хотим сохранить только однородные элементы и требовать естественный порядок сортировки по умолчанию, мы можем перейти к классу, реализующему интерфейс comparable.

Компаратор:
Всякий раз, когда мы хотим сохранить однородные и гетерогенные элементы и сортировать их в настроенном порядке сортировки по умолчанию, мы можем использовать интерфейс comparator.

0 голосов
/ 13 сентября 2018

Comparable - это естественный порядок сортировки по умолчанию, при условии, что числовые значения имеют возрастание, а строки - алфавитный порядок. например:

Treeset t=new Treeset();
t.add(2);
t.add(1);
System.out.println(t);//[1,2]

Comparator - это пользовательский порядок сортировки, реализованный в пользовательском классе myComparator путем переопределения метода сравнения. например:

Treeset t=new Treeset(new myComparator());
t.add(55);
t.add(56);
class myComparator implements Comparator{
public int compare(Object o1,Object o2){
//Descending Logic
}
}
System.out.println(t);//[56,55]
0 голосов
/ 12 октября 2011

Очень простой подход состоит в том, чтобы предположить, что рассматриваемый класс сущностей будет представлен в базе данных, а затем в таблице базы данных вам понадобится индекс, составленный из полей класса сущностей? Если ответ «да», тогда реализуйте сравнимый и используйте индексные поля для естественного порядка сортировки. Во всех остальных случаях используйте компаратор.

0 голосов
/ 08 января 2012

Моя библиотека аннотаций для реализации 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);         
    }  
}

Нажмите на ссылку, чтобы увидеть больше примеров. http://code.google.com/p/compamatic/wiki/CompamaticByExamples

0 голосов
/ 15 июля 2015

Меня попросили отсортировать определенный диапазон чисел за лучшее время, чем в одном из интервью. (Без использования сортировки Подсчет)

Реализация интерфейса Comparable над объектом позволяет неявным алгоритмам сортировки использовать переопределенный метод compareTo для упорядочивания элементов сортировки, и это будет линейное время.

0 голосов
/ 29 октября 2012

Моя потребность была отсортирована по дате.

Итак, я использовал Comparable, и он легко работал для меня.

public int compareTo(GoogleCalendarBean o) {
    // TODO Auto-generated method stub
    return eventdate.compareTo(o.getEventdate());
}

Одно ограничение с Comparable состоит в том, что они не могут использоваться для коллекций, отличных от List.

0 голосов
/ 20 мая 2014

Если у вас есть класс, лучше используйте Comparable . Как правило, Comparator используется, если у вас нет класса, но вы должны использовать его TreeSet или TreeMap , поскольку Comparator можно передать как параметр в конструкторе TreeSet или TreeMap. Вы можете увидеть, как использовать Comparator и Comparable в http://preciselyconcise.com/java/collections/g_comparator.php

...