Ordenar hashmap basado en claves

79

Tengo el siguiente hashmap en java:

{B046 = 0.0, A061 = 3.0, A071 = 0.0, B085 = 0.0, B075 = 3.0, B076 = 9.0, B086 = 3.0, B095 = 0.0, B096 = 0.0, A052 = 0.0, B066 = 0.0, B056 = 9.0, B065 = 0.0, B055 = 9.0}

¿Cómo debo ordenar el mapa de hash de modo que se tengan en cuenta el alfabeto seguido de las cifras numéricas?

El hashmap resultante debería verse así:

{A052 = 0.0, A061 = 3.0, A071 = 0.0, B046 = 0.0, B055 = 9.0, B056 = 9.0, B065 = 0.0, B066 = 0.0, B075 = 3.0, B076 = 9.0, B085 = 0.0, B086 = 3.0, B095 = 0.0, B096 = 0.0}

¡Agradezco la ayuda!

usuario1008697
fuente
3
hashmap es para búsquedas. Tiene hash de las cosas. No mantiene el orden.
Muhammad Hasan Khan
2
@HasanKhan ... ¿quién preguntó eso?
eRaisedToX

Respuestas:

239

Usar ordenado TreeMap:

Map<String, Float> map = new TreeMap<>(yourMap);

Colocará automáticamente las entradas ordenadas por claves. Creo que el Stringorden natural estará bien en tu caso.

Tenga en cuenta que HashMapdebido a las optimizaciones de búsqueda no conserva el orden.

Tomasz Nurkiewicz
fuente
Hola @Tomasz Nurkiewicz ¿Cómo puedo obtener el orden inverso?
Raghavendra
¿Puedo aplicar mi propio comparador
Fakher
¡Gran Solución! Hay un problema con números de 2 dígitos, la clasificación se convierte en 1, 10, 11,12,2,3,4,5. Hay alguna solución para esto ?
Rachita Nanda
@RachitaNanda, podrías intentar almacenar los dígitos con Integer than string.
Krishna
27

Utilice un TreeMap con un comparador personalizado.

class MyComparator implements Comparator<String>
    {
        public int compare(String o1,String o2)
        {
            // Your logic for comparing the key strings
        }
    }

TreeMap<String, Float> tm = new TreeMap<String , Float>(new MyComparator());

A medida que agregue nuevos elementos, se ordenarán automáticamente.

En su caso, es posible que ni siquiera sea necesario implementar un comparador porque el ordenamiento de cadenas puede ser suficiente. Pero si desea implementar casos especiales, como las letras alfa en minúsculas que aparecen antes de las mayúsculas, o tratar los números de cierta manera, use el comparador.

Kal
fuente
11

TreeMapes su mejor apuesta para este tipo de clasificación (Natural). TreeMapnaturalmente ordena según las claves.

HashMapno conserva el orden de inserción ni ordena el mapa. LinkedHashMapmantiene el orden de inserción pero no ordena el mapa automáticamente. Solo TreeMapen la Mapinterfaz se ordena el mapa de acuerdo con el orden natural (los números primero, el alfabeto en mayúsculas en segundo lugar, el alfabeto en minúsculas al final).

Roshnal
fuente
5

Use un TreeMap , aunque tener un mapa "con ese aspecto" es un poco nebuloso; también puede ordenar las claves según sus criterios e iterar sobre el mapa, recuperando cada objeto.

Dave Newton
fuente
3

Solo usa un TreeMap. Implementa la SortedMapinterfaz y, por lo tanto, ordena automáticamente las claves que contiene. Sus claves se pueden ordenar alfabéticamente para obtener el resultado deseado, por lo que ni siquiera necesita proporcionar un comparador.

Los HashMaps nunca se ordenan. Lo único que podría hacer con un HashMap es obtener todas las claves y almacenarlas en un conjunto ordenado o en una Lista y ordenar la Lista.

JB Nizet
fuente
3

Usando el TreeMap puede ordenar el mapa.

Map<String, String> map = new HashMap<String, String>();        
Map<String, String> treeMap = new TreeMap<String, String>(map);
//show hashmap after the sort
for (String str : treeMap.keySet()) {
    System.out.println(str);
}
BERGUIGA Mohamed Amine
fuente
3

Puede usar TreeMapque almacenará valores en forma ordenada.

Map <String, String> map = new TreeMap <String, String>();
Saurabh Prajapati
fuente
2

Utilice TreeMap (constructor):

Map<String, Float> sortedMap = new TreeMap<>(yourMap);

Utilice TreeMap (método PutAll):

Map<String, Float> sortedMap = new TreeMap<>();
sortedMap.putAll(yourMap);

Implementación de la interfaz Map:

  1. TreeMap : ordena automáticamente las claves en orden ascendente mientras las inserta.
  2. HashMap : no se mantendrá el orden de inserción .
  3. LinkedHashMap : se mantendrá el orden de inserción.
Sangeeth
fuente
1

TreeMap se clasificará automáticamente en orden ascendente. Si desea ordenar en orden descendente, use el siguiente código:

Copie el siguiente código dentro de su clase y fuera del método de ejecución principal:

static class DescOrder implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {      
        return o2.compareTo(o1);
    }
    }

Entonces en tu lógica:

TreeMap<String, String> map = new TreeMap<String, String>(new DescOrder());
map.put("A", "test1");
map.put("C", "test3");
map.put("E", "test5");
map.put("B", "test2");
map.put("D", "test4");
JavaGeek
fuente