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

  1. Реализовать Comparable интерфейс, класс должен реализовывать один метод compareTo()

    int a.compareTo(b)

  2. Вы должны изменить класс, экземпляр которого вы хотите отсортировать. Так что для каждого класса может быть создана только одна последовательность сортировки.

java.util.Comparator

  1. Для реализации интерфейса Comparator класс должен реализовывать один метод compare()

    int compare (a,b)

  2. Вы создаете класс отдельно от класса, экземпляр которого вы хотите отсортировать. Так что последовательность сортировки может быть создана для каждого класса.

Comparable предназначен для обеспечения порядка по умолчанию для объектов данных, например, если объекты данных имеют естественный порядок.

Comparator представляет собой заказ для конкретного использования.

Comparable обычно предпочтительнее. Но иногда класс уже реализует Comparable, но вы хотите отсортировать по другому свойству. Тогда вы вынуждены использовать Comparator,

Некоторые классы на самом деле предоставляют Comparators для общих случаев; например, String s по умолчанию чувствительны к регистру при сортировке, но есть и статический Comparator называется CASE_INSENSITIVE_ORDER,

Вот несколько различий между Comparator и Comparable, которые я нашел в Интернете:

  1. Если вы видите, что логическое различие между этими двумя аспектами заключается в том, что Comparator в Java сравнивает два предоставленных ему объекта, тогда как интерфейс Comparable сравнивает ссылку "this" с указанным объектом.

  2. Comparable в Java используется для реализации естественного упорядочения объекта. В Java API String, Date и классы-оболочки реализуют интерфейс Comparable.

  3. Если какой-либо класс реализует интерфейс Comparable в Java, коллекция этого объекта, либо List, либо Array, может быть автоматически отсортирована с помощью метода Collections.sort() или Array.sort(), а объект будет отсортирован в соответствии с естественным порядком, определенным методом CompareTo.

  4. Объекты, которые реализуют 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

Другие вопросы по тегам