Реализации SortedMap
и SortedSet
в стандартном API Java либо используют Comparator<Key>
и вызывают его метод compare(k1, k2)
, либо предполагают, что ключи реализуют Comparable<Key>
, и вызывают k1.compareTo(k2)
.Большинство предлагают оба, в зависимости от того, какой конструктор используется.(EnumMap / EnumSet этого не делают, поскольку они поддерживают только встроенное упорядочение значений enum по порядку объявления.)
Подход Comparable
требует, чтобы ключи всегда сортировались одинаково, ибудет использоваться для ключей, которые имеют каноническое упорядочение (например, целые числа), где вы хотите использовать это упорядочение.
Подход Comparator
является более гибким, поскольку вы можете использовать одни и те же ключевые объекты для разных карт, гдеони упорядочены по-разному, и вы можете использовать его для ключей, над которыми у вас нет контроля, или у которых нет канонического порядка (например, Список, деревья / графики и т. д.). Вы также можете использовать его для сортировки ключей строк по другим критериям.чем чистое значение Unicode (например, на основе локали), используя Collator (это класс, реализующий Comparator).
Оба требуют полного порядка для ваших ключей, но я полагаю, что это необходимо для вашего дерева AVL,тоже.
Вот реализация Comparator, которая работает с любыми сопоставимыми объектами, поэтому вы можете использовать ее (возможно, внутри) в качестве адаптерадля сопоставимого варианта.
public static <X extends Comparable<X>> Comparator<X> makeComparator() {
return new Comparator<X>() {
public int compare(X left, X right) {
return left.compareTo(right);
}
};
}