Comparable определяет естественный порядок. Это означает, что вы определяете, когда один объект следует считать «меньше» или «больше чем».
Предположим, у вас есть целая куча и вы хотите отсортировать их. Это довольно просто, просто поместите их в отсортированную коллекцию, верно?
TreeSet<Integer> m = new TreeSet<Integer>();
m.add(1);
m.add(3);
m.add(2);
for (Integer i : m)
... // values will be sorted
Но теперь предположим, что у меня есть некоторый пользовательский объект, где сортировка имеет смысл для меня, но не определена. Допустим, у меня есть данные, представляющие районы по почтовому индексу с плотностью населения, и я хочу отсортировать их по плотности:
public class District {
String zipcode;
Double populationDensity;
}
Теперь самый простой способ их сортировки - это определить их с естественным упорядочением, реализуя Comparable, что означает, что есть стандартный способ, которым эти объекты определены для упорядочения.
public class District implements Comparable<District>{
String zipcode;
Double populationDensity;
public int compareTo(District other)
{
return populationDensity.compareTo(other.populationDensity);
}
}
Обратите внимание, что вы можете сделать эквивалентную вещь, определив компаратор. Разница в том, что компаратор определяет логику упорядочения вне объекта . Возможно, в отдельном процессе мне нужно упорядочить одни и те же объекты по почтовому индексу - в этом случае упорядочение не обязательно является свойством объекта или отличается от естественного упорядочения объектов. Вы можете использовать внешний компаратор для определения пользовательского порядка целых чисел, например, сортируя их по алфавитному значению.
В принципе, логика упорядочения должна где-то существовать. Это может быть -
в самом объекте, если он естественно сопоставим (расширяет Comparable - например, целые числа)
поставляется во внешнем компараторе, как в примере выше.