Como ordenar un HashMap en Java

Hola a todos, hoy os voy a explicar como podemos ordenar un HashMap en Java.

Si recordáis, un HashMap es una estructura dinámica, donde tenemos elementos asociados por clave y valor.

Algo normal que suele pasar, es que queramos ordenar los elementos.

El truco esta en usar la clase TreeMap, que es igual que HashMap pero esta ordena los elementos de forma automática, pero si queremos ordenarlo de una forma concreta se lo debemos indicar.

 

Vamos a ver un ejemplo:


HashMap<String, Integer> map = new HashMap<>();

map.put("e", 1);
map.put("a", 2);
map.put("c", 3);
map.put("b", 4);
map.put("d", 5);

Con esto tenemos nuestro mapa, pero como veis, las claves estan desordenadas.

Si lo quisieramos ordenar, usamos un TreeMap:


TreeMap<String, Integer> t = new TreeMap<>();

t.putAll(map);

for (String key : t.keySet()) {
    System.out.println("Clave: " + key + ", Valor: " + t.get(key));
}

Fíjate que lo que hago realmente es pasar todo el contenido del HashMap al TreeMap.

Este es el resultado:

IMPORTANTE, HashMap a la hora de añadir puede llegar a hacer cosas raras, como ordenar de una forma u otra (cosa que no debería).

Hasta ahora hemos ordenado de forma alfabética, digamos la forma por defecto, pero, ¿si quiero ordenar de otra forma como lo hago?

 

Tenemos que indicarle al HashMap la forma y para ello, nos creamos una clase que implemente la clase  Comparator con el tipo de nuestra clave.


import java.util.Comparator;

public class OrdenarDesc implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    
}

Para ordenar descendentemente, dentro de compareTo, como String ya tiene su compareTo, lo aprovechamos.


import java.util.Comparator;

public class OrdenarDesc implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        return o2.compareTo(o1);
    }
    
}

Para utilizarlo, creamos el TreeMap, pasándole una instancia de la clase que hemos creado:

 


t = new TreeMap<>(new OrdenarDesc());
t.putAll(map);

for (String key : t.keySet()) {
    System.out.println("Clave: " + key + ", Valor: " + t.get(key));
}

Este es el resultado:

Aquí os dejo para descargar el ejemplo.

Os dejo el ejemplo completo:


import java.util.HashMap;
import java.util.TreeMap;

public class OrdenarHashMap {
    public static void main(String[] args) {

        System.out.println("Creación hashmap");
        HashMap<String, Integer> map = new HashMap<>();

        map.put("e", 1);
        map.put("a", 2);
        map.put("c", 3);
        map.put("b", 4);
        map.put("d", 5);

        System.out.println("Insertamos todos los elementos en el treemap");
        TreeMap<String, Integer> t = new TreeMap<>();

        t.putAll(map);

        System.out.println("Mostramos el treemap (asc)");
        for (String key : t.keySet()) {
            System.out.println("Clave: " + key + ", Valor: " + t.get(key));
        }

        System.out.println("Creamos el hashmap con la clase que le indica como ordenar");
        t = new TreeMap<>(new OrdenarDesc());
        t.putAll(map);

        System.out.println("Mostramos el treemap (desc)");
        for (String key : t.keySet()) {
            System.out.println("Clave: " + key + ", Valor: " + t.get(key));
        }

    }

}

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Etiquetas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *