Cómo ordenar un hashmap por su valor

Una de las particularidades de los Maps o diccionarios, es que por defecto no tienen un orden en particular, en especial cuando se trata de sus valores. Sin embargo si llegaras a necesitar tener ordenados los registros por sus valores, hay algunas técnicas que puedes seguir.

Opción 1: Convertirlo a una lista y luego ordenarla

La opción más sencilla es convertir el Map a una lista y luego ordenarla. Para esto, lo que tienes que hacer es lo siguientes:

  1. Crear un LinkedList de tipo Map.Entry y se le asigna el Entry Set del map
  2. Ordenar el LinkedList con base en los valores
  3. Reconvertir la lista en Map

Por ejemplo.

import java.util.*;

public class Main
{
	public static void main(String[] args) {
	    /*
	        1.- Se crea el Map
	    */
	    
        Map<String, Integer> map = new HashMap<>();
        
        map.put("manzana", 20);
        map.put("platano", 12);
        map.put("papaya", 31);
        map.put("naranja", 15);
        
        /*
            2. Se convierte en una lista el Map
        */
        
        List<Map.Entry<String, Integer>> sortedList = new LinkedList<>(map.entrySet());
        
        
        /*
            3. Se ordena los elementos (Map.Entry) por valores
        */
        
        sortedList.sort((v1, v2) -> v2.getValue().compareTo(v1.getValue()));
        
        System.out.println(sortedList.toString());
	}
}

Opción 2: usar streams

Al igual que la opción anterior, debemos convertirlo a una lista, pero en este caso se puede crear todo una sola línea usando streams.

Para realizarlo, se deben hacer los siguientes pasos:

  1. Crear el entry set del map a través del método “entrySet()
  2. Invocar el método stream
  3. Ejecutar la función “sorted()” y pasarle como parámetro “Map.Entry.comparingByValue())”.
  4. Crear la lista usando el método collect().

Ejemplo del código:

import java.util.*;
import java.util.stream.*;

public class Main
{
	public static void main(String[] args) {
		System.out.println("Hello World");
		
		Map<String,Integer> map = new HashMap<>();
		
	    map.put("manzana",23);
	    map.put("platano",11);
	    map.put("uva",33);
	    map.put("mango", 15);
	    map.put("kiwi", 44);
	    
	    List<Map.Entry<String, Integer>> sortedList = map
	        .entrySet()
	        .stream()
            .sorted(Map.Entry.comparingByValue())
	        .collect(Collectors.toList());
	    
	    System.out.println(map.toString());
	    
	    
	    Collections.reverse(sortedList);
	    System.out.println(sortedList.toString());
	}
}

Conceptos

  • Streams: es una API dentro de Java que te permite procesar de forma eficiente colecciones de datos.
  • EntrySet: es un método dentro de la clase hashmap que crea un conjunto de todos los elementos dentro de la colección. Esto se usa para facilitar es uso de operaciones concretas.
  • Collections: es un conjunto de clases e interfaces usadas para ordenar y procesar información.

Conclusión

Ordenar colecciones por valor en estructuras como los HashMaps es relativamente sencillo, lo único que se tiene que hacer es convertirla a una lista de elementos de tipo Map.Entry y luego utilizar las funciones que incluye la interface.

Para que esta tarea sea más sencilla para ti, es ideal conocer los métodos que están incluidos en las interfaces de tipo List y la API de stream.

Taggedestructuras de datos