Почему class Java должен быть сопоставимым?

Почему используется Java Comparable ? Почему кто-то реализует Comparable в classе? Каков пример реальной жизни, когда вам нужно сопоставлять?

10 Solutions collect form web for “Почему class Java должен быть сопоставимым?”

Вот пример реальной жизни. Обратите внимание, что String также реализует Comparable .

 class Author implements Comparable{ String firstName; String lastName; @Override public int compareTo(Author other){ // compareTo should return < 0 if this is supposed to be // less than other, > 0 if this is supposed to be greater than // other and 0 if they are supposed to be equal int last = this.lastName.compareTo(other.lastName); return last == 0 ? this.firstName.compareTo(other.firstName) : last; } } 

позже..

 /** * List the authors. Sort them by name so it will look good. */ public List listAuthors(){ List authors = readAuthorsFromFileOrSomething(); Collections.sort(authors); return authors; } /** * List unique authors. Sort them by name so it will look good. */ public SortedSet listUniqueAuthors(){ List authors = readAuthorsFromFileOrSomething(); return new TreeSet(authors); } 

Сопоставимый определяет естественный порядок. Это означает, что вы определяете его, когда один объект следует считать «меньше» или «больше».

Предположим, у вас есть куча целых чисел, и вы хотите их отсортировать. Это довольно просто, просто поместите их в сортированную коллекцию, не так ли?

 TreeSet m = new TreeSet(); m.add(1); m.add(3); m.add(2); for (Integer i : m) ... // values will be sorted 

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

 public class District { String zipcode; Double populationDensity; } 

Теперь самый простой способ их сортировки – определить их с помощью естественного упорядочения путем реализации Comparable, что означает, что существует стандартный способ определения этих объектов:

 public class District implements Comparable{ String zipcode; Double populationDensity; public int compareTo(District other) { return populationDensity.compareTo(other.populationDensity); } } 

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

В принципе логика заказа должна существовать где-то. Это может быть –

  • в самом объекте, если он естественно сопоставим (расширяет числа Comparable -eg integers)

  • поставляемый во внешнем компараторе, как в приведенном выше примере.

Цитируется из javadoc;

Этот интерфейс накладывает полный порядок на объекты каждого classа, который его реализует. Это упорядочение называется естественным упорядочением classа, а метод compareTo classа называется его естественным методом сравнения.

Списки (и массивы) объектов, которые реализуют этот интерфейс, могут быть отсортированы автоматически Collections.sort (и Arrays.sort). Объекты, реализующие этот интерфейс, могут использоваться как ключи на сортированной карте или как элементы в отсортированном наборе без указания компаратора.

Edit: .. и сделал важный бит смелым.

Тот факт, что class реализует Comparable означает, что вы можете взять два объекта из этого classа и сравнить их. Некоторые classы, такие как определенные коллекции (функция сортировки в коллекции), которые хранят объекты в порядке, полагаются на их сопоставимость (для сортировки вам нужно знать, какой объект является «самым большим» и т. Д.).

Большинство примеров выше показывают, как повторно использовать существующий сопоставимый объект в функции compareTo. Если вы хотите реализовать свой собственный compareTo, когда вы хотите сравнить два объекта одного и того же classа, скажем, объект AirlineTicket, который вы хотите отсортировать по цене (меньше занимает первое место), а затем число остановок (опять же, меньше занимает первое место), вы бы сделали следующее:

 class AirlineTicket implements Comparable { public double cost; public int stopovers; public AirlineTicket(double cost, int stopovers) { this.cost = cost; this.stopovers = stopovers ; } public int compareTo(Cost o) { if(this.cost != o.cost) return Double.compare(this.cost, o.cost); //sorting in ascending order. if(this.stopovers != o.stopovers) return this.stopovers - o.stopovers; //again, ascending but swap the two if you want descending return 0; } } 

Простой способ реализовать несколько полевых сравнений – это сравнение с Guava ComparisonChain – тогда вы можете сказать

  public int compareTo(Foo that) { return ComparisonChain.start() .compare(lastName, that.lastName) .compare(firstName, that.firstName) .compare(zipCode, that.zipCode) .result(); } 

вместо

  public int compareTo(Person other) { int cmp = lastName.compareTo(other.lastName); if (cmp != 0) { return cmp; } cmp = firstName.compareTo(other.firstName); if (cmp != 0) { return cmp; } return Integer.compare(zipCode, other.zipCode); } } 

Например, если вы хотите иметь отсортированную коллекцию или карту

Comparable используется для сравнения экземпляров вашего classа. Мы можем сравнивать экземпляры по многим причинам, поэтому нам нужно реализовать метод compareTo , чтобы узнать, как (атрибуты) мы хотим сравнивать экземпляры.

Класс Dog :

 package test; import java.util.Arrays; public class Main { public static void main(String[] args) { Dog d1 = new Dog("brutus"); Dog d2 = new Dog("medor"); Dog d3 = new Dog("ara"); Dog[] dogs = new Dog[3]; dogs[0] = d1; dogs[1] = d2; dogs[2] = d3; for (int i = 0; i < 3; i++) { System.out.println(dogs[i].getName()); } /** * Output: * brutus * medor * ara */ Arrays.sort(dogs, Dog.NameComparator); for (int i = 0; i < 3; i++) { System.out.println(dogs[i].getName()); } /** * Output: * ara * medor * brutus */ } } 

Main class:

 package test; import java.util.Arrays; public class Main { public static void main(String[] args) { Dog d1 = new Dog("brutus"); Dog d2 = new Dog("medor"); Dog d3 = new Dog("ara"); Dog[] dogs = new Dog[3]; dogs[0] = d1; dogs[1] = d2; dogs[2] = d3; for (int i = 0; i < 3; i++) { System.out.println(dogs[i].getName()); } /** * Output: * brutus * medor * ara */ Arrays.sort(dogs, Dog.NameComparator); for (int i = 0; i < 3; i++) { System.out.println(dogs[i].getName()); } /** * Output: * ara * medor * brutus */ } } 

Вот хороший пример использования сопоставимых в Java:

http://www.onjava.com/pub/a/onjava/2003/03/12/java_comp.html?page=2

Когда вы реализуете интерфейс Comparable , вам необходимо реализовать метод compareTo() . Это нужно для сравнения объектов, чтобы использовать, например, метод сортировки classа ArrayList . Вам нужен способ сравнить ваши объекты, чтобы их сортировать. Таким образом, вам нужен собственный метод compareTo() в вашем classе, чтобы вы могли использовать его с методом сортировки ArrayList . Метод compareTo() возвращает -1,0,1.

Я только что прочитал соответствующую главу в Java Head 2.0, я все еще учился.

Хорошо, но почему бы просто не определить метод compareTo() без реализации сопоставимого интерфейса. Например, class City определяется по его name temperature и

 public int compareTo(City theOther) { if (this.temperature < theOther.temperature) return -1; else if (this.temperature > theOther.temperature) return 1; else return 0; } 
  • Камера Android не работает. startPreview не работает
  • завершение программы на выходе основного streamа?
  • Странное поведение java с приведениями к примитивным типам
  • java: Class.isInstance vs Class.isAssignableFrom
  • char и int в Java
  • Обновите обновление ProgressBar
  • Управление конструкторами со многими параметрами в Java
  • READ_EXTERNAL_STORAGE разрешение для Android
  • Как получить URL из хранилища Firebase getDownloadURL
  • Как правильно переопределить toString () на Java?
  • Трансляция, когда состояние сети изменилось
  • Interesting Posts

    Дата даты YYYY-MM-DD в сценарии оболочки

    eventlisteners, использующие hibernate 4.0 с весной 3.1.0.release?

    Преобразовать фиксированную ширину в CSV?

    Не удалось получить доступ к настройкам в Windows 8.1

    Доступ к WHS 2003 Share из Windows 8

    Доступ к Windows из Linux / Mac по имени с использованием TCP / IP

    Откройте страницу Facebook из приложения для Android?

    Мой ноутбук стирает диск d, а затем настроил раздел восстановления, чтобы я мог продать ноутбук

    Ошибка ссылки на службу: не удалось сгенерировать код для ссылки на службу

    У Windows 7 есть ремонтная установка (например, у XP)?

    Какое пространство имен XML используется с JSF 2.2

    Как я эхо-звезды (*) при чтении пароля с `read`?

    Безопасно ли установить Mac непосредственно в Интернет?

    Изменение поведения Ctrl + Tab для перемещения между документами в Visual Studio

    Список и выбор точек доступа WLAN (базовых станций) в Mac OS X

    Давайте будем гением компьютера.