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 em Java
- Ordenação Natural das Chaves O
TreeMaporganiza os elementos automaticamente em ordem crescente das chaves (quando as chaves implementam a interfaceComparable), como números em ordem numérica ou strings em ordem alfabética. - Comparadores Personalizados Se precisar de uma ordem personalizada, você pode criar um
TreeMapcom um comparador customizado. Isso permite ordenar as chaves conforme qualquer lógica necessária, desde a ordem inversa até ordens complexas. - 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. - Não Permite Chaves Nulas Ao contrário do
HashMap, oTreeMapnão permite chavesnull, 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
- Criação do TreeMap: Criamos um
TreeMapchamadopopulacaoCidades, onde as chaves (String) representam os nomes das cidades e os valores (Integer) representam suas populações. - Ordenação Alfabética: Por padrão, o
TreeMapordena as chaves em ordem alfabética. - Primeiro e Último Elemento: Utilizamos
firstKey()elastKey()para obter o primeiro e o último elemento do mapa. - 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.
