Ordenar un Map de Java por valores

JavaBeginner
Practicar Ahora

Introducción

En Java, los Map por defecto no están ordenados y almacenan datos en formato clave-valor. A menudo es necesario ordenarlos según los valores para tomar decisiones basadas en los valores. En este laboratorio paso a paso, aprenderemos cómo ordenar un Map de Java según los valores.

Creando un Map en Java

Primero, crearemos un Map de estudiantes con sus nombres y alturas en centímetros para entender cómo ordenar mapas en Java.

import java.util.*;

public class MapSortingDemo {
    public static void main(String args[]) {
        Map<String, Integer> students = new HashMap<>();
        students.put("Student 1", 159);
        students.put("Student 2", 147);
        students.put("Student 3", 183);
        students.put("Student 4", 167);
        students.put("Student 5", 173);
    }
}

Ordenar un Map según los valores

Para ordenar el Map según los valores, necesitamos crear una Lista a partir de Map.entrySet(). Este método devuelve todos los pares clave-valor del Map. La función Comparator entra en juego cuando se ordena un conjunto particular que depende de múltiples parámetros. En la función comparator, return student1.getValue().compareTo(student2.getValue()); decide la forma de ordenar, es decir, por valor, y esto ordenará el Map según los valores.

List<Map.Entry<String, Integer>> studentList = new ArrayList<>(students.entrySet());

Collections.sort(studentList, new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Map.Entry<String, Integer> student1, Map.Entry<String, Integer> student2) {
        return student1.getValue().compareTo(student2.getValue());
    }
});

Mostrar el Map ordenado según los valores

Muestra el Map ordenado en la consola.

for (Map.Entry<String, Integer> student : studentList) {
    System.out.println(student.getKey() + " " + student.getValue());
}

Ordenar un Map utilizando una expresión lambda

También podemos ordenar un Map según los valores usando Expresiones Lambda, lo cual es una forma más corta y eficiente.

List<Map.Entry<String, Integer>> studentList = new ArrayList<>(students.entrySet());

studentList.sort((student1, student2) -> student1.getValue().compareTo(student2.getValue()));

Mostrar el Map ordenado según los valores con una expresión lambda

Muestra el Map ordenado en la consola.

studentList.forEach(student -> System.out.println(student.getKey() + " " + student.getValue()));

Ordenar un Map según las claves

Del mismo modo, podemos ordenar el Map según las claves. En la función comparator, return student1.getKey().compareTo(student2.getKey()); decide la forma de ordenar, es decir, por clave.

List<Map.Entry<String, Integer>> studentList = new ArrayList<>(students.entrySet());

Collections.sort(studentList, new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Map.Entry<String, Integer> student1, Map.Entry<String, Integer> student2) {
        return student1.getKey().compareTo(student2.getKey());
    }
});

Mostrar el Map ordenado según las claves

Muestra el Map ordenado en la consola.

for (Map.Entry<String, Integer> student : studentList) {
    System.out.println(student.getKey() + " " + student.getValue());
}

Ordenar un Map según las claves utilizando una expresión lambda

También podemos ordenar un Map según las claves usando Expresiones Lambda, lo cual es una forma más corta y eficiente.

List<Map.Entry<String, Integer>> studentList = new ArrayList<>(students.entrySet());

studentList.sort((student1, student2) -> student1.getKey().compareTo(student2.getKey()));

Mostrar un Map ordenado según las claves utilizando una expresión lambda

Muestra el Map ordenado en la consola.

studentList.forEach(student -> System.out.println(student.getKey() + " " + student.getValue()));

Resumen

En este laboratorio, aprendimos cómo ordenar un Map de Java según los valores usando el método Collections.sort() y funciones Comparator, así como usando Expresiones Lambda. También aprendimos cómo ordenar un Map según las claves. Ordenar un Map según los valores puede ser útil en muchas situaciones, como en operaciones de clasificación o basadas en prioridad.