Когда класс должен быть сопоставимым и / или компаратором? [закрытый]


Я видел классы, которые реализуют как сопоставимо и компаратор. Что это значит? Почему я должен использовать один над другим?

11 113

11 ответов:

текст ниже, происходит от компаратор против сопоставимого

сравнима

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

компаратор

объект компаратора способен сравнивать два разных объекта. Класс не сравнивает свои экземпляры, но некоторые другие экземпляры класса. Этот класс компаратора должен реализовать java.util.Comparator интерфейс.

реализация Comparable значит "я могу сравнить себя с другим объектом."Это обычно полезно, когда есть одно естественное сравнение по умолчанию.

реализация Comparator значит "я могу сравнить два других объекта."Это обычно полезно, когда есть несколько способов сравнения двух экземпляров типа - например, вы можете сравнить людей по возрасту, имени и т. д.

Comparable позволяет классу реализовать собственное сравнение:

  • это один и тот же класс (это часто преимущество)
  • не может быть только одна реализация (так что вы не можете использовать это, если вы хотите два разных случая)

по сравнению, компаратор является внешним сравнением:

  • обычно это уникальный экземпляр (либо в том же классе, либо в другом месте)
  • вы назовите каждую реализацию С тем, как вы хотите отсортировать вещи
  • вы можете обеспечить компараторы для классы, которые вы не контролируете
  • реализация можно использовать, даже если первый объект null

в обеих реализациях вы все еще можете выберите то, что вы хотите сравнить. С помощью дженериков вы можете объявить so и проверить его во время компиляции. Это повышает безопасность, но это также является проблемой для определения соответствующей стоимости.

в качестве ориентира я обычно использую самый общий класс или интерфейс, с которым можно сравнить этот объект, во всех случаях использования, которые я представляю... Не очень точное определение, однако ! : - (

  • Comparable<Object> позволяет использовать его во всех кодах во время компиляции (что хорошо, если это необходимо, или плохо, если нет, и вы теряете ошибку времени компиляции); ваша реализация должна справляться с объектами и приводить по мере необходимости, но в a надежный способ.
  • Comparable<Itself> очень строго наоборот.

забавно, когда вы подкласс себя в подкласс, подкласс также должен быть сопоставим и быть устойчивым к нему (или это нарушит принцип Лискова и даст вам ошибки времени выполнения).

java.ленг.Сравним

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

    int a.compareTo(b)

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

java.утиль.Компаратор

  1. чтобы реализовать интерфейс компаратора, класс должен реализовать один метод compare()

    int compare (a,b)

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

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

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

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

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

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

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

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

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

  4. объекты, которые реализуют сопоставимые в Java, могут использоваться в качестве ключей в отсортированной карте или элементов в отсортированном наборе, например TreeSet, без указания каких-либо Компаратор.

сайт: как использовать Comparator и Comparable в Java? С примером

подробнее: как использовать Comparator и Comparable в Java? С примером

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

разница между компаратором и сопоставимыми интерфейсами

Comparable используется для сравнения себя с помощью другого объекта.

Comparator используется для сравнения двух типов объектов.

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

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

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

объекты, которые реализуют Comparable в Java можно использовать в качестве ключей в отсортированной карте или элементов в отсортированном наборе, например TreeSet, без указания каких-либо Comparator.

моя аннотация 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