Короткий ответ
Используйте 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 раз медленнее для каждого поиска элемента.