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 TreeMap
genau so, wie es bei der Verwendung einer Map
Implementierung 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 TreeMap
und 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 TreeMap
oder daran, TreeSet
dass es andere Leistungsmerkmale als HashMap
oder aufweist HashSet
. Grob gesagt gehen Operationen, die ein Element finden oder einfügen, von O (1) nach O (Log (N)) .
In a HashMap
wirkt sich das Verschieben von 1000 auf 10.000 Elemente nicht wirklich auf Ihre Zeit zum Nachschlagen eines Elements aus, aber für a ist TreeMap
die Nachschlagezeit etwa dreimal langsamer (unter der Annahme von Protokoll 2 ). Das Verschieben von 1000 auf 100.000 ist bei jeder Elementsuche etwa sechsmal langsamer.