Я бачив класи, в яких реалізуються і Порівняння, і Порівняння . Що це означає? Навіщо мені використовувати один над іншим?
Я бачив класи, в яких реалізуються і Порівняння, і Порівняння . Що це означає? Навіщо мені використовувати один над іншим?
Відповіді:
Наведений нижче текст походить від " Порівняння проти порівняльного"
Порівнюваний
Порівнюваний об'єкт здатний порівнювати себе з іншим об'єктом. Сам клас повинен реалізувати java.lang.Comparable
інтерфейс, щоб мати можливість порівнювати його екземпляри.
Компаратор
Об'єкт порівняння здатний порівнювати два різні об'єкти. Клас не порівнює свої екземпляри, а деякі інстанції класу. Цей клас порівняння повинен реалізувати java.util.Comparator
інтерфейс.
Реалізація Comparable
означає " я можу порівняти себе з іншим об'єктом ". Це зазвичай корисно, коли існує єдине природне порівняння за замовчуванням.
Реалізація Comparator
означає " Я можу порівняти два інші об'єкти ". Це, як правило, корисно, коли існує декілька способів порівняння двох примірників типу - наприклад, ви можете порівняти людей за віком, іменем тощо.
Person
реалізації Comparable
, тому що ви не можете змінити , як порівнюються дві людини.
Person
. 2) Порівняльник, наприклад, PersonAgeComparator
який здатний порівняти дві різні сутності та вирішити, який повинен бути першим у цьому конкретному порядку сортування. 3) Код сортування, який бере колекцію сутностей і компаратор, і сортує цю колекцію за допомогою порівняльника для визначення порядку.
Порівняне дозволяє класу реалізувати власне порівняння:
Для порівняння, компаратор - це зовнішнє порівняння:
В обох реалізаціях ви все ще можете вибрати, з чим ви хочете порівнювати . За допомогою generics ви можете заявити про це і перевірити це під час компіляції. Це підвищує безпеку, але це також завдання визначити відповідне значення.
Як правило, я, як правило, використовую найзагальніший клас чи інтерфейс, з яким цей об'єкт можна порівняти, я передбачаю всі випадки використання ... Хоча не дуже точне визначення! :-(
Comparable<Object>
дозволяє використовувати його у всіх кодах під час компіляції (що добре, якщо потрібно, або погано, якщо ні, і ви втрачаєте помилку часу компіляції); Ваша реалізація повинна справлятися з об'єктами та робити це за потребою, але надійно.Comparable<Itself>
дуже суворо навпаки.Смішно, коли ви підкласируете себе до підкласу, підклас також повинен бути порівнянним і бути надійним щодо нього (або він би порушив Принцип Ліскова і призведе до помилок виконання).
java.lang.Comparable
Для реалізації Comparable
інтерфейсу клас повинен реалізувати єдиний методcompareTo()
int a.compareTo(b)
Ви повинні змінити клас, екземпляр якого ви хочете сортувати. Так що для одного класу може бути створена лише одна послідовність сортування.
java.util.Comparator
Для реалізації інтерфейсу Comparator клас повинен реалізувати єдиний метод compare()
int compare (a,b)
Comparable
зазвичай є кращим. Але іноді клас вже реалізований Comparable
, але ви хочете сортувати за іншою властивістю. Тоді ви змушені використовувати Comparator
.
Деякі класи насправді передбачають Comparators
загальні випадки; Наприклад, String
s за замовчуванням залежать від регістру при сортуванні, але також існує статична Comparator
назва CASE_INSENSITIVE_ORDER
.
ось кілька відмінностей між компаратором та порівнянним, що я знайшов в Інтернеті:
Якщо ви бачите, тоді логічною різницею між цими двома є компаратор порівняння в Java, порівняйте два надані йому об'єкти, тоді як порівняльний інтерфейс порівнює "це" посилання з вказаним об'єктом.
Порівняльний в Java використовується для здійснення природного упорядкування об'єкта. У класах Java API String, Date та обгортка реалізують Порівнюваний інтерфейс.
Якщо будь-який клас реалізує порівняльний інтерфейс Java, то колекцію цього об'єкта або List або Array можна сортувати автоматично, використовуючи метод Collections.sort () або Array.sort () і об'єкт буде відсортовано на основі природного порядку, визначеного методом CompareTo.
Об'єкти, що реалізують порівнянне в Java, можуть використовуватися як ключі в відсортованій карті або елементи в відсортованому наборі, наприклад, TreeSet, без зазначення будь-якого компаратора.
сайт: Як користуватися компаратором та порівнянним на Java? З прикладом
Детальніше: Як користуватися компаратором та порівнянним на Java? З прикладом
Comparable
призначений для об'єктів із природним упорядкуванням. Сам об’єкт знає, як його замовити.
Comparator
призначений для об'єктів без природного замовлення або коли ви хочете використовувати інше замовлення.
Різниця між компараторським та порівнянним інтерфейсами
Comparable
використовується для порівняння себе за допомогою іншого об’єкта.
Comparator
використовується для порівняння двох типів даних є об'єктами.
Якщо ви бачите, то логічна різниця між цими двома полягає Comparator
в Java порівнянні двох наданих йому об'єктів, в той час як Comparable
інтерфейс порівнює "це" посилання з вказаним об'єктом.
Comparable
на Java використовується для здійснення природного упорядкування об'єкта. У Java API String, дати та обгорткові класи реалізують Comparable
інтерфейс.
Якщо який - або клас реалізації Comparable
інтерфейсу в Java , то збір цього об'єкта або List
або Array
може бути відсортований автоматично, використовуючи Collections.sort()
або Array.sort()
метод і об'єкт буде відсортований на основі там природному порядку , визначеному compareTo
методом.
Об'єкти, які реалізуються Comparable
в Java, можуть використовуватися як ключі в відсортованій карті або елементи в сортованому наборі, наприклад TreeSet
, без зазначення жодного 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);
}
}
Клацніть посилання, щоб побачити більше прикладів. співчутливий