Ich stimme der Sache mit LinkedHashMap zu. Ich habe nur meine Erkenntnisse und Erfahrungen zusammengestellt, als ich vor dem Problem stand, als ich versuchte, HashMap nach Schlüsseln zu sortieren.
Mein Code zum Erstellen von HashMap:
HashMap<Integer, String> map;
@Before
public void initData() {
map = new HashMap<>();
map.put(55, "John");
map.put(22, "Apple");
map.put(66, "Earl");
map.put(77, "Pearl");
map.put(12, "George");
map.put(6, "Rocky");
}
Ich habe eine Funktion showMap, die Einträge der Karte druckt:
public void showMap (Map<Integer, String> map1) {
for (Map.Entry<Integer, String> entry: map1.entrySet()) {
System.out.println("[Key: "+entry.getKey()+ " , "+"Value: "+entry.getValue() +"] ");
}
}
Wenn ich jetzt die Karte vor dem Sortieren drucke, wird die folgende Reihenfolge gedruckt:
Map before sorting :
[Key: 66 , Value: Earl]
[Key: 22 , Value: Apple]
[Key: 6 , Value: Rocky]
[Key: 55 , Value: John]
[Key: 12 , Value: George]
[Key: 77 , Value: Pearl]
Dies unterscheidet sich grundlegend von der Reihenfolge, in der die Kartenschlüssel eingegeben wurden.
Wenn ich es jetzt mit Kartenschlüsseln sortiere:
List<Map.Entry<Integer, String>> entries = new ArrayList<>(map.entrySet());
Collections.sort(entries, new Comparator<Entry<Integer, String>>() {
@Override
public int compare(Entry<Integer, String> o1, Entry<Integer, String> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
HashMap<Integer, String> sortedMap = new LinkedHashMap<>();
for (Map.Entry<Integer, String> entry : entries) {
System.out.println("Putting key:"+entry.getKey());
sortedMap.put(entry.getKey(), entry.getValue());
}
System.out.println("Map after sorting:");
showMap(sortedMap);
Die Ausgabe lautet:
Sorting by keys :
Putting key:6
Putting key:12
Putting key:22
Putting key:55
Putting key:66
Putting key:77
Map after sorting:
[Key: 66 , Value: Earl]
[Key: 6 , Value: Rocky]
[Key: 22 , Value: Apple]
[Key: 55 , Value: John]
[Key: 12 , Value: George]
[Key: 77 , Value: Pearl]
Sie können den Unterschied in der Reihenfolge der Schlüssel sehen. Die sortierte Reihenfolge der Schlüssel ist in Ordnung, aber die der Schlüssel der kopierten Karte liegt wieder in der gleichen Reihenfolge wie die frühere Karte. Ich weiß nicht, ob dies gültig ist, aber für zwei Hashmaps mit denselben Schlüsseln ist die Reihenfolge der Schlüssel gleich. Dies impliziert die Aussage, dass die Reihenfolge der Schlüssel nicht garantiert ist, aber für zwei Maps mit denselben Schlüsseln aufgrund der inhärenten Natur des Algorithmus zum Einfügen von Schlüsseln gleich sein kann, wenn die HashMap-Implementierung dieser JVM-Version erfolgt.
Wenn ich jetzt LinkedHashMap verwende, um sortierte Einträge in HashMap zu kopieren, erhalte ich das gewünschte Ergebnis (was natürlich war, aber das ist nicht der Punkt. Der Punkt betrifft die Reihenfolge der Schlüssel von HashMap).
HashMap<Integer, String> sortedMap = new LinkedHashMap<>();
for (Map.Entry<Integer, String> entry : entries) {
System.out.println("Putting key:"+entry.getKey());
sortedMap.put(entry.getKey(), entry.getValue());
}
System.out.println("Map after sorting:");
showMap(sortedMap);
Ausgabe:
Sorting by keys :
Putting key:6
Putting key:12
Putting key:22
Putting key:55
Putting key:66
Putting key:77
Map after sorting:
[Key: 6 , Value: Rocky]
[Key: 12 , Value: George]
[Key: 22 , Value: Apple]
[Key: 55 , Value: John]
[Key: 66 , Value: Earl]
[Key: 77 , Value: Pearl]