Kurze Antwort
Verwenden Sie a TreeMap. Genau dafür ist es.
Wenn diese Karte an Sie übergeben wird und Sie den Typ nicht bestimmen können, können Sie Folgendes tun:
SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) {
String value = map.get(key);
// do something
}
Dies wird in der natürlichen Reihenfolge der Schlüssel über die Karte iteriert.
Längere Antwort
Technisch gesehen können Sie alles verwenden, was implementiert wird SortedMap, aber in seltenen Fällen beträgt dies TreeMapgenau so, wie es bei der Verwendung einer MapImplementierung normalerweise der Fall ist HashMap.
In Fällen, in denen Ihre Schlüssel ein komplexer Typ sind, der Comparable nicht implementiert, oder Sie dann nicht die natürliche Reihenfolge verwenden möchten TreeMapund TreeSetüber zusätzliche Konstruktoren verfügen, mit denen Sie Folgendes übergeben können 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());
Denken Sie bei der Verwendung eines TreeMapoder daran, TreeSetdass es andere Leistungsmerkmale als HashMapoder aufweist HashSet. Grob gesagt gehen Operationen, die ein Element finden oder einfügen, von O (1) nach O (Log (N)) .
In a HashMapwirkt sich das Verschieben von 1000 auf 10.000 Elemente nicht wirklich auf Ihre Zeit zum Nachschlagen eines Elements aus, aber für a ist TreeMapdie Nachschlagezeit etwa dreimal langsamer (unter der Annahme von Protokoll 2 ). Das Verschieben von 1000 auf 100.000 ist bei jeder Elementsuche etwa sechsmal langsamer.