Ordenando um HashMap

JavaBeginner
Pratique Agora

Introdução

Um HashMap é uma coleção que armazena pares chave-valor. No entanto, ele não armazena os pares chave-valor em nenhuma ordem específica e não mantém a ordem de inserção dos elementos. Pode haver casos em que queremos visualizar os dados armazenados de forma ordenada. Nesses casos, precisamos ordenar o HashMap.

Criar um novo arquivo Java

Primeiramente, precisamos criar um novo arquivo Java para escrever o código para ordenar um HashMap. Abra o terminal e navegue até o diretório onde deseja criar o arquivo. Use o seguinte comando para criar um novo arquivo chamado HashMapSortDemo.java.

touch HashMapSortDemo.java

Ordenando por Chaves usando Collections.sort()

Podemos ordenar um HashMap por chaves usando o método Collections.sort(). Siga o código abaixo:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map.Entry;

public class HashMapSortDemo {
    public static void main(String args[]) {
        HashMap<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("one", 1);
        unsortedMap.put("two", 2);
        unsortedMap.put("three", 3);
        unsortedMap.put("four", 4);
        unsortedMap.put("five", 5);

        System.out.println("Printing the Unsorted HashMap");
        for(Entry<String, Integer> e : unsortedMap.entrySet()) {
            System.out.println(e.getKey() + "-->" + e.getValue());
        }

        ArrayList<String> sortedList = new ArrayList<>(unsortedMap.keySet());
        Collections.sort(sortedList);

        System.out.println("\nPrinting the Alphabetically Sorted Keys");
        for(String s : sortedList) {
            System.out.println(s + "-->" + unsortedMap.get(s));
        }
    }
}

O código acima está ordenando o HashMap por chaves usando o método Collections.sort().

Use o seguinte comando para compilar e executar o código:

javac HashMapSortDemo.java && java HashMapSortDemo

Ordenando por Valores usando Collections.sort()

Podemos ordenar um HashMap por valores usando o método Collections.sort(). Siga o código abaixo:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map.Entry;

public class HashMapSortDemo {
    public static void main(String args[]) {
        HashMap<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("one", 1);
        unsortedMap.put("two", 2);
        unsortedMap.put("three", 3);
        unsortedMap.put("four", 4);
        unsortedMap.put("five", 5);

        System.out.println("Printing the Unsorted HashMap");
        for(Entry<String, Integer> e : unsortedMap.entrySet()) {
            System.out.println(e.getKey() + "-->" + e.getValue());
        }

        ArrayList<Integer> sortedList = new ArrayList<>(unsortedMap.values());
        Collections.sort(sortedList);

        System.out.println("\nPrinting the Sorted Values");
        for(Integer i : sortedList) {
            System.out.println(i);
        }
    }
}

O código acima está ordenando o HashMap por valores usando o método Collections.sort().

Use o seguinte comando para compilar e executar o código:

javac HashMapSortDemo.java && java HashMapSortDemo

Ordenando por Chaves usando TreeMap

Podemos ordenar um HashMap por chaves usando um TreeMap. Um TreeMap armazena automaticamente os pares chave-valor em ordem ordenada (ordenada por chaves). Siga o código abaixo:

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.TreeMap;

public class HashMapSortDemo {
    public static void main(String args[]) {
        HashMap<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("one", 1);
        unsortedMap.put("two", 2);
        unsortedMap.put("three", 3);
        unsortedMap.put("four", 4);
        unsortedMap.put("five", 5);

        System.out.println("Printing the Unsorted HashMap");
        for(Entry<String, Integer> e : unsortedMap.entrySet()) {
            System.out.println(e.getKey() + "-->" + e.getValue());
        }

        TreeMap<String, Integer> sortedMap = new TreeMap<>(unsortedMap);

        System.out.println("\nPrinting the Sorted TreeMap");
        for(Entry<String, Integer> e : sortedMap.entrySet()) {
            System.out.println(e.getKey() + "-->" + e.getValue());
        }
    }
}

O código acima está ordenando o HashMap por chaves usando um TreeMap.

Use o seguinte comando para compilar e executar o código:

javac HashMapSortDemo.java && java HashMapSortDemo

Ordenando por Valores usando TreeSet

Podemos ordenar um HashMap por valores usando um TreeSet. Um TreeSet também armazena dados em ordem ordenada (ordenada por valores). Siga o código abaixo:

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.TreeSet;

public class HashMapSortDemo {
    public static void main(String args[]) {
        HashMap<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("one", 1);
        unsortedMap.put("two", 2);
        unsortedMap.put("three", 3);
        unsortedMap.put("four", 4);
        unsortedMap.put("five", 5);

        unsortedMap.put("fourteen", 4);
        unsortedMap.put("fifteen", 5);
        unsortedMap.put("twenty", 2);

        System.out.println("Printing the Unsorted HashMap");
        for(Entry<String, Integer> e : unsortedMap.entrySet()) {
            System.out.println(e.getKey() + "-->" + e.getValue());
        }

        TreeSet<Integer> sortedSet = new TreeSet<>(unsortedMap.values());

        System.out.println("\nThe sorted values are: " + sortedSet);
    }
}

O código acima está ordenando o HashMap por valores usando um TreeSet.

Use o seguinte comando para compilar e executar o código:

javac HashMapSortDemo.java && java HashMapSortDemo

Ordenação usando Stream e expressões Lambda

Podemos ordenar um HashMap em uma única linha de código usando Java Streams e expressões Lambda. Siga o código abaixo:

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Stream;

public class HashMapSortDemo {
    public static void main(String args[]) {
        HashMap<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("one", 1);
        unsortedMap.put("two", 2);
        unsortedMap.put("three", 3);
        unsortedMap.put("four", 4);
        unsortedMap.put("five", 5);

        System.out.println("Printing the Unsorted HashMap");
        for(Entry<String, Integer> e : unsortedMap.entrySet()) {
            System.out.println(e.getKey() + "-->" + e.getValue());
        }

        Stream<Entry<String, Integer>> sortedStream = unsortedMap.entrySet()
                                        .stream()
                                        .sorted(Map.Entry.<String, Integer>comparingByKey());

        System.out.println("\nPrinting the Sorted Key-Value Pairs");
        sortedStream.forEach(System.out :: println);
    }
}

O código acima está ordenando o HashMap usando Java Streams e expressões Lambda.

Use o seguinte comando para compilar e executar o código:

javac HashMapSortDemo.java && java HashMapSortDemo

Ordenação por Valores usando Stream e Expressões Lambda

Também podemos ordenar um HashMap por valores usando Java Streams e expressões Lambda. Siga o código abaixo:

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Stream;

public class HashMapSortDemo {
    public static void main(String args[]) {
        HashMap<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("one", 1);
        unsortedMap.put("two", 2);
        unsortedMap.put("three", 3);
        unsortedMap.put("four", 4);
        unsortedMap.put("five", 5);

        System.out.println("Printing the Unsorted HashMap");
        for(Entry<String, Integer> e : unsortedMap.entrySet()) {
            System.out.println(e.getKey() + "-->" + e.getValue());
        }

        Stream<Entry<String, Integer>> sortedStream = unsortedMap.entrySet()
                                        .stream()
                                        .sorted(Map.Entry.<String, Integer>comparingByValue());

        System.out.println("\nPrinting the Sorted Key-Value Pairs");
        sortedStream.forEach(System.out :: println);
    }
}

O código acima está ordenando o HashMap por valores usando Java Streams e expressões Lambda.

Use o seguinte comando para compilar e executar o código:

javac HashMapSortDemo.java && java HashMapSortDemo

Usando a Biblioteca Guava do Google

A biblioteca Guava do Google nos fornece uma classe ImmutableSortedMap. Podemos usar o método copyOf() desta classe para ordenar um HashMap. Siga o código abaixo:

import java.util.HashMap;
import java.util.Map.Entry;
import com.google.common.collect.ImmutableSortedMap;

public class HashMapSortDemo {
    public static void main(String args[]) {
        HashMap<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("one", 1);
        unsortedMap.put("two", 2);
        unsortedMap.put("three", 3);
        unsortedMap.put("four", 4);
        unsortedMap.put("five", 5);

        System.out.println("Printing the Unsorted HashMap");
        for (Entry<String, Integer> e : unsortedMap.entrySet()) {
            System.out.println(e.getKey() + "-->" + e.getValue());
        }

        ImmutableSortedMap<String, Integer> sortedMap = ImmutableSortedMap.copyOf(unsortedMap);

        System.out.println("\nPrinting the Sorted ImmutableSortedMap");
        System.out.println(sortedMap);
    }
}

O código acima está ordenando o HashMap usando a biblioteca Guava do Google.

Use o seguinte comando para compilar e executar o código:

javac -cp ".:guava-30.1.1-jre.jar" HashMapSortDemo.java && java -cp ".:guava-30.1.1-jre.jar" HashMapSortDemo

Limpeza de Dados

Finalmente, exclua o arquivo HashMapSortDemo.java usando o seguinte comando:

rm HashMapSortDemo.java

Resumo

Neste laboratório, vimos como ordenar um HashMap por chaves ou valores. Usamos diferentes métodos como Collections.sort(), TreeMap, TreeSet, Java Streams e expressões Lambda, e a biblioteca Guava do Google para ordenar o HashMap. Também aprendemos sobre seus casos de uso e como podemos escrever um código eficiente para ordenar o HashMap em Java.