Интерфейс Java SortedMap, java.util.SortedMap, является подтипом интерфейса java.util.Map, за исключением того, что элементы, хранящиеся в карте, отсортированы внутри. Это означает, что вы можете перебирать элементы в порядке сортировки.
Реализация
Java поставляется со встроенной реализацией интерфейса SortedMap под названием TreeMap(java.util.TreeMap).
Как создать SortedMap?
Вы создаете экземпляр TreeMap через его конструктор:
SortedMap sortedMap = new TreeMap();
Как создать с компаратором?
Можно передать реализацию Comparator конструктору TreeMap. Затем этот компаратор будет использоваться для сортировки ключей, пар значений, хранящихся в SortedMap. Вот пример:
Comparator comparator = new MyComparatorImpl(); SortedMap sortedMap = new TreeMap(comparator);
Порядок сортировки
Порядок сортировки — это либо естественный порядок сортировки элементов (если они реализуют java.lang.Comparable), либо порядок, определенный компаратором, который вы можете задать.
По возрастанию или по убыванию
По умолчанию элементы идут в порядке возрастания, начиная с «наименьшего» и перемещаясь к «наибольшему». Но также возможно перебирать элементы в порядке убывания, используя метод TreeMap.descendingKeySet().
Итерация
Вы перебираете SortedMap точно так же, как вы перебираете обычную карту. Так как ключи отсортированы, вам, скорее всего, потребуется перебрать ключи в их отсортированном порядке. Вы перебираете их, вызывая его метод keySet(), например так:
SortedMap sortedMap = new TreeMap();
sortedMap.put("a", "one");
sortedMap.put("b", "two");
sortedMap.put("c", "three");
Iterator iterator = sortedMap.keySet().iterator();
while(iterator.hasNext()) {
String key =(String) iterator.next();
String value =(String) sortedMap.get(key);
}
Помните, что если вы хотите перебирать ключи в порядке убывания, а не в порядке возрастания, используйте метод sortedMap.descendingKeySet(). Iterator(), например:
SortedMap sortedMap = new TreeMap();
sortedMap.put("a", "one");
sortedMap.put("b", "two");
sortedMap.put("c", "three");
Iterator iterator = sortedMap.descendingKeySet().iterator();
while(iterator.hasNext()) {
String key =(String) iterator.next();
String value =(String) sortedMap.get(key);
}
Как получить компаратор?
Если ваша SortedMap была создана с использованием Comparator, вы можете получить его с помощью метода comptor():
Comparator comparator = sortedMap.comparator();
Как получить первый ключ?
Интерфейс имеет метод ярлыков для получения первого (самого низкого) ключа в наборе ключей. Этот метод называется firstKey():
String firstKey =(String) sortedMap.firstKey();
Как получить последний ключ?
Интерфейс имеет метод для получения последнего (самого высокого) ключа в наборе ключей — lastKey():
String lastKey =(String) sortedMap.lastKey();
Получение первых элементов
Интерфейс имеет метод headMap(). Он возвращает новую карту, которая содержит первые элементы SortedMap в соответствии с используемым порядком сортировки. Метод принимает параметр, который действует как разделитель того, какие элементы включаются в возвращаемую карту заголовка. Все элементы с ключом, который меньше / ранее, чем параметр, переданный методу. Вот пример получения карты заголовка:
SortedMap sortedMap = new TreeMap();
sortedMap.put("a", "1");
sortedMap.put("c", "3");
sortedMap.put("e", "5");
sortedMap.put("d", "4");
sortedMap.put("b", "2");
SortedMap headMap = sortedMap.headMap("c");
System.out.println(headMap);
Возвращаемая карта головы будет содержать пары ключ-значение («a», «1») и («b», «2»), поскольку ключи «a» и «b» меньше / раньше, чем «c» в порядке сортировки (естественном порядке), используемом этим SortedMap.
Получение последних элементов
Интерфейс имеет метод с именем tailMap(), который возвращает новую карту Map. Она содержит последние элементы SortedMap в соответствии с используемым порядком сортировки. Метод принимает параметр, который действует как разделитель того, какие элементы включаются в возвращенную карту хвостов. Все элементы с ключом, равным или превышающим параметр, переданный методу. Вот пример:
SortedMap sortedMap = new TreeMap();
sortedMap.put("a", "1");
sortedMap.put("c", "3");
sortedMap.put("e", "5");
sortedMap.put("d", "4");
sortedMap.put("b", "2");
SortedMap tailMap = sortedMap.tailMap("c");
System.out.println(tailMap);
Возвращенная карта хвоста будет содержать ключ, пары значений («c», «3»), («d», «4») и («e», «5»), поскольку «c», «d» и «e» больше или равно «c», переданному в качестве параметра tailMap().
Подкарта
Имеется метод subMap(), который может возвращать новую карту — подкарту SortedMap. Метод принимает два параметра, которые действуют как разделители для того, какие элементы включены в возвращаемую подкарту. Она будет включать все элементы, у которых ключ равен первому параметру или превышает его, а второй — меньше. Вот пример:
SortedMap sortedMap = new TreeMap();
sortedMap.put("a", "1");
sortedMap.put("c", "3");
sortedMap.put("e", "5");
sortedMap.put("d", "4");
sortedMap.put("b", "2");
SortedMap subMap = sortedMap.subMap("b", "e");
System.out.println(subMap);
Возвращенная подкарта будет содержать ключ, пары значений («b», «2), (» c «,» 3 «) и (» d «,» 4 «), поскольку ключи» b «,» c «и» d «равны или больше, чем» b «, и меньше, чем» e «.
