Estoy de acuerdo con LinkedHashMap. Solo pongo mis hallazgos y experiencia mientras enfrentaba el problema cuando intentaba ordenar HashMap por claves.
Mi código para crear 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");
}
Tengo una función showMap que imprime las entradas del mapa:
public void showMap (Map<Integer, String> map1) {
for (Map.Entry<Integer, String> entry: map1.entrySet()) {
System.out.println("[Key: "+entry.getKey()+ " , "+"Value: "+entry.getValue() +"] ");
}
}
Ahora, cuando imprimo el mapa antes de ordenar, imprime la siguiente secuencia:
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]
Que es básicamente diferente al orden en el que se colocaron las claves del mapa.
Ahora, cuando lo ordeno con claves de mapa:
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);
la salida es:
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]
Puede ver la diferencia en el orden de las claves. El orden ordenado de las claves está bien, pero el de las claves del mapa copiado está nuevamente en el mismo orden del mapa anterior. No sé si esto es válido para decirlo, pero para dos hashmap con las mismas claves, el orden de las claves es el mismo. Esto implica para la declaración que el orden de las claves no está garantizado, pero puede ser el mismo para dos mapas con las mismas claves debido a la naturaleza inherente del algoritmo de inserción de claves si se implementa HashMap de esta versión de JVM.
Ahora, cuando uso LinkedHashMap para copiar entradas ordenadas a HashMap, obtengo el resultado deseado (que era natural, pero ese no es el punto. El punto está relacionado con el orden de las claves de 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);
Salida:
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]