Ответ
Для корректной работы TreeMap ключи должны быть сравнимыми. Это достигается одним из двух способов:
- Реализация интерфейса
Comparableсамим классом ключа. - Передача внешнего
Comparatorв конструкторTreeMap.
Ключевые требования к сравнению:
- Согласованность с
equals: МетодcompareTo(илиcompare) должен возвращать0только тогда, когдаequalsвозвращаетtrue. Нарушение этого контракта приведет к противоречивому поведению коллекции, реализующей интерфейсSortedMap(какTreeMap). - Транзитивность: Если
a.compareTo(b) > 0иb.compareTo(c) > 0, то должно выполнятьсяa.compareTo(c) > 0.
Пример корректного класса-ключа:
class Person implements Comparable<Person> {
private String name;
private int age;
// Конструктор, геттеры...
@Override
public int compareTo(Person other) {
// Сначала сравниваем по имени, затем по возрасту
int nameCompare = this.name.compareTo(other.name);
if (nameCompare != 0) {
return nameCompare;
}
return Integer.compare(this.age, other.age);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return age == person.age && name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
// Использование
TreeMap<Person, String> map = new TreeMap<>();