Когда класс должен быть Comparable и/или Comparator?[закрыто]

StackOverflow https://stackoverflow.com/questions/1440134

  •  10-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Текст ниже взят из Компаратор против сопоставимого

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

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

Компаратор

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

Другие советы

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

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

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

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

Для сравнения, Comparator является внешним сравнением:

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

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

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

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

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

java.lang.Сравнимое

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

    int a.compareTo(b)

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

java.util.Компаратор

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

    int compare (a,b)

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

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

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

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

Некоторые классы фактически предоставляют String для общих случаев; например, CASE_INSENSITIVE_ORDER являются по умолчанию чувствителен к регистру при сортировке, но есть также статический <=> с именем <=> .

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

<Ол>
  • Если вы видите, что логическое различие между этими двумя понятиями заключается в том, что 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.

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

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

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

    Разница между интерфейсами Comparator и Comparable

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

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

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

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

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

    Объекты, которые реализуют <=> в Java, могут использоваться в качестве ключей в отсортированной карте или элементов в отсортированном наборе, например <=>, без указания <=>.

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top