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

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

Ответ 1

Текст ниже представлен Сравнение с сопоставимым

Сопоставимые

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

Компаратор

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

java.lang.Comparable

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

    int a.compareTo(b)

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

java.util.Comparator

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

    int compare (a,b)

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

Ответ 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