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:
- Crear un LinkedList de tipo
Map.Entry
y se le asigna elEntry Set
del map - Ordenar el
LinkedList
con base en los valores - 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:
- Crear el entry set del map a través del método “
entrySet()
” - Invocar el método stream
- Ejecutar la función “
sorted()
” y pasarle como parámetro “Map.Entry.comparingByValue())”
. - 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.