Ordenando Java Map por Valores

JavaBeginner
Pratique Agora

Introdução

Em Java, os Maps são, por padrão, não ordenados e armazenam dados no formato chave-valor. Frequentemente, é necessário ordená-los com base nos valores para tomar decisões com base nesses valores. Neste laboratório passo a passo, aprenderemos como ordenar um Java Map com base nos valores.

Criando um Map em Java

Primeiramente, criaremos um Map de estudantes com seus nomes e alturas em centímetros para entender como ordenar maps em 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);
    }
}

Ordenando um Map com Base nos Valores

Para ordenar o Map com base nos valores, precisamos criar uma List a partir de Map.entrySet(). Este método retorna todos os pares chave-valor do Map. A função Comparator entra em ação ao ordenar um conjunto específico que depende de múltiplos parâmetros. Na função comparator, return student1.getValue().compareTo(student2.getValue()); decide a forma de ordenação, ou seja, por valor, e isso ordenará o Map com base nos 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());
    }
});

Exibindo um Map Ordenado com Base nos Valores

Exiba o Map ordenado no console.

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

Ordenando um Map Usando Expressões Lambda

Também podemos ordenar um Map com base nos valores usando Expressões Lambda (Lambda Expressions), que é uma forma mais curta e eficiente.

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

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

Exibindo um Map Ordenado por Valores com Expressões Lambda

Exiba o Map ordenado no console.

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

Ordenando um Map com Base nas Chaves

Da mesma forma, podemos ordenar o Map com base nas chaves. Na função comparadora (comparator function), return student1.getKey().compareTo(student2.getKey()); decide a forma de ordenação, ou seja, por chave.

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());
    }
});

Exibir Map Ordenado com Base nas Chaves

Exiba o Map ordenado no console.

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

Ordenando Map com Base nas Chaves usando Expressão Lambda

Também podemos ordenar um Map com base nas chaves usando Expressões Lambda (Lambda Expressions), que é uma forma mais curta e eficiente.

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

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

Exibir Map Ordenado com Base nas Chaves usando Expressões Lambda

Exiba o Map ordenado no console.

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

Resumo

Neste laboratório, aprendemos como ordenar um Java Map com base nos valores usando o método Collections.sort() e funções Comparator, bem como usando Expressões Lambda (Lambda Expressions). Também aprendemos como ordenar um Map com base nas chaves. Ordenar um Map com base nos valores pode ser útil em muitas situações, como classificação ou operações baseadas em prioridade.