Ответ
Метод compareTo(T o) интерфейса Comparable<T> возвращает целое число, определяющее естественный порядок сортировки объектов.
Правила возврата значения
- Отрицательное число (чаще -1): Текущий объект (
this) меньше объектаo. - Ноль (0): Объекты равны в смысле порядка.
- Положительное число (чаще 1): Текущий объект (
this) больше объектаo.
Примеры и логика
1. Стандартные классы (String, Integer):
String a = "apple";
String b = "banana";
System.out.println(a.compareTo(b)); // -1 ("a" < "b" лексикографически)
System.out.println(b.compareTo(a)); // 1 ("b" > "a")
Integer x = 5;
Integer y = 10;
System.out.println(x.compareTo(y)); // -1 (5 < 10)
System.out.println(y.compareTo(x)); // 1 (10 > 5)
2. Пользовательский класс:
class Person implements Comparable<Person> {
private String name;
private int age;
// Сортировка по возрасту (первичный ключ), затем по имени (вторичный)
@Override
public int compareTo(Person other) {
// Сравниваем возраст
int ageCompare = Integer.compare(this.age, other.age);
if (ageCompare != 0) {
return ageCompare; // Возвращаем результат сравнения возрастов
}
// Если возрасты равны, сравниваем имена
return this.name.compareTo(other.name);
}
}
3. Важная альтернатива (Java 8+): Использование Comparator.comparing() для лаконичности:
Comparator<Person> comparator = Comparator
.comparingInt(Person::getAge)
.thenComparing(Person::getName);
// Не требует реализации Comparable в классе Person
Ключевой контракт: Метод должен быть согласован с equals() (хотя это не строгое требование компилятора). Если compareTo() возвращает 0, ожидается, что equals() вернет true. Нарушение этого правила может привести к некорректной работе в коллекциях, основанных на порядке (например, TreeSet).