Краткий ответ
Используйте TreeMap
. Это именно то, для чего это.
Если эта карта передана вам, и вы не можете определить тип, то вы можете сделать следующее:
SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) {
String value = map.get(key);
// do something
}
Это будет проходить по карте в естественном порядке ключей.
Более длинный ответ
Технически, вы можете использовать все, что реализует SortedMap
, но за исключением редких случаев это составляет TreeMap
, так же как использование Map
обычно составляет HashMap
.
Для случаев, когда ваши ключи являются сложным типом, который не реализует Comparable, или вы не хотите использовать естественный порядок, тогда TreeMap
и TreeSet
имеют дополнительные конструкторы, которые позволяют вам передавать Comparator
:
// placed inline for the demonstration, but doesn't have to be a lambda expression
Comparator<Foo> comparator = (Foo o1, Foo o2) -> {
...
}
SortedSet<Foo> keys = new TreeSet<>(comparator);
keys.addAll(map.keySet());
Помните, что при использовании TreeMap
или TreeSet
производительность будет отличаться от HashMap
или HashSet
. Грубо говоря, операции по поиску или вставке элемента будут идти от O (1) до O (Log (N)) .
В HashMap
переход от 1000 элементов к 10000 на самом деле не влияет на ваше время поиска элемента, но для TreeMap
время поиска будет примерно в 3 раза медленнее (при условии Log 2 ). Перемещение от 1000 до 100 000 будет примерно в 6 раз медленнее для каждого поиска элемента.