Короткий ответ
Используйте TreeMap
. Это именно то, для чего это.
Если эта карта передана вам, и вы не можете определить тип, то вы можете сделать следующее:
SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) {
String value = map.get(key);
// do something
}
Это будет проходить по карте в естественном порядке ключей.
Более длинный ответ
Технически, вы можете использовать все, что реализует SortedMap
, но, за исключением редких случаев, это равнозначно тому TreeMap
, как Map
обычно используют реализацию HashMap
.
Для случаев , когда ключи представляют собой сложный тип , который не реализует Сопоставимые или вы не хотите использовать естественный порядок , то 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 раз медленнее для каждого поиска элемента.