TreeMap em Java: Ordenação de Elementos

O TreeMap em Java é uma implementação da interface Map que armazena os elementos em pares chave-valor, mas com uma diferença fundamental em relação ao HashMap: ele ordena automaticamente os elementos com base nas chaves. Essa estrutura é útil quando é necessário manter os dados em ordem crescente, de acordo com a ordenação natural das chaves ou uma ordem personalizada definida por um comparador.

Características do TreeMap

  1. Ordenação Natural das Chaves O TreeMap organiza os elementos automaticamente em ordem crescente das chaves (quando as chaves implementam a interface Comparable), como números em ordem numérica ou strings em ordem alfabética.
  2. Comparadores Personalizados Se precisar de uma ordem personalizada, você pode criar um TreeMap com um comparador customizado. Isso permite ordenar as chaves conforme qualquer lógica necessária, desde a ordem inversa até ordens complexas.
  3. Navegação Eficiente O TreeMap é implementado como uma árvore de busca binária (geralmente uma Red-Black Tree). Isso permite a navegação eficiente e o uso de métodos adicionais para obter subconjuntos e navegar pelo mapa de forma ordenada.
  4. Não Permite Chaves Nulas Ao contrário do HashMap, o TreeMap não permite chaves null, pois isso interromperia a ordenação.

Principais Métodos do TreeMap

  • put(K key, V value): Adiciona um par chave-valor ao mapa.
  • get(Object key): Retorna o valor associado a uma chave específica.
  • remove(Object key): Remove a entrada associada a uma chave.
  • firstKey() e lastKey(): Retornam a primeira e a última chave, respectivamente, na ordem.
  • subMap(K fromKey, K toKey): Retorna uma visualização do mapa, contendo elementos entre as chaves especificadas.
  • descendingMap(): Retorna uma versão invertida do mapa, ordenada de maneira decrescente.

Exemplo de Uso do TreeMap

Vamos criar um exemplo de TreeMap para armazenar nomes de cidades e suas populações, ordenando as cidades por ordem alfabética.

import java.util.TreeMap;

public class ExemploTreeMap {
    public static void main(String[] args) {
        TreeMap<String, Integer> populacaoCidades = new TreeMap<>();

        // Adicionando pares chave-valor
        populacaoCidades.put("São Paulo", 12300000);
        populacaoCidades.put("Rio de Janeiro", 6748000);
        populacaoCidades.put("Belo Horizonte", 2523000);
        populacaoCidades.put("Curitiba", 1948000);

        // Exibindo o TreeMap em ordem alfabética
        System.out.println("População das cidades em ordem alfabética:");
        for (String cidade : populacaoCidades.keySet()) {
            System.out.println("Cidade: " + cidade + ", População: " + populacaoCidades.get(cidade));
        }

        // Acessando o primeiro e o último elemento
        System.out.println("Primeira cidade: " + populacaoCidades.firstKey());
        System.out.println("Última cidade: " + populacaoCidades.lastKey());

        // Subconjunto de elementos
        System.out.println("Subconjunto de cidades entre 'Belo Horizonte' e 'São Paulo':");
        TreeMap<String, Integer> subMapa = new TreeMap<>(populacaoCidades.subMap("Belo Horizonte", "São Paulo"));
        subMapa.forEach((cidade, populacao) -> System.out.println("Cidade: " + cidade + ", População: " + populacao));
    }
}

Explicação do Código

  1. Criação do TreeMap: Criamos um TreeMap chamado populacaoCidades, onde as chaves (String) representam os nomes das cidades e os valores (Integer) representam suas populações.
  2. Ordenação Alfabética: Por padrão, o TreeMap ordena as chaves em ordem alfabética.
  3. Primeiro e Último Elemento: Utilizamos firstKey() e lastKey() para obter o primeiro e o último elemento do mapa.
  4. Subconjunto de Cidades: Usamos o método subMap() para obter um subconjunto do mapa entre duas chaves especificadas.

Quando Usar o TreeMap

O TreeMap é ideal quando você precisa que os elementos estejam ordenados com base nas chaves. Aqui estão alguns cenários onde o TreeMap pode ser a melhor escolha:

  • Listas classificadas automaticamente: Como uma lista de usuários ordenada por nome ou de produtos ordenados por preço.
  • Intervalos de dados: Quando você precisa acessar ou manipular intervalos específicos de dados.
  • Navegação por ordem: Quando a navegação por ordem crescente ou decrescente é uma prioridade.

Conclusão

O TreeMap é uma estrutura de dados versátil para mapear dados chave-valor com ordenação automática. Em comparação com o HashMap, que é focado em velocidade de acesso sem ordenação, o TreeMap permite navegação e manipulação de dados em uma ordem específica, útil para aplicações que exigem organização e fácil visualização dos dados.