image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image

CO

Cássio Oliveira06/02/2024 22:47
Compartilhe

Funções em Java: Explorando o Potencial do Map em Java

  • #Java

No vasto mundo da programação Java, quanto mais ferramentas dominamos, melhor conseguimos desempenhar nossas tarefas do dia-a-dia. Nesse artigo, vamos explorar o potencial da estrutura Map, que se destaca como uma ferramenta essencial para mapear chaves e valores únicos. Seu papel é crucial para armazenar e recuperar dados de maneira eficiente, com base em chaves associadas.

Vamos mergulhar nesse universo e descobrir como aproveitar ao máximo o poder do Map em Java, através de exemplos práticos e uma abordagem detalhada de seu funcionamento.

O Map em Java é uma interface que faz parte do Java Collections Framework e é representada por pares chave-valor, onde cada chave está associada a um único valor. Ele permite armazenar e recuperar dados eficientemente com base em chaves exclusivas, evitando duplicatas. Isso garante uma relação de um-para-um entre as chaves e os valores correspondentes.

Com uma variedade de métodos disponíveis para adicionar (put()), remover (remove()), obter (get()) e manipular pares chave-valor (size(), containsKey(), containsValue(), etc), o Map é uma estrutura de dados versátil e poderosa para diversas aplicações na programação.

O Map, como interface, possui uma série de implementações com diferentes comportamentos e características para atender às diferentes necessidades de programação. Eis apenas algumas delas:

  • AbstractMap: Classe abstrata que fornece implementações parciais de muitos métodos da interface Map. Outras classes Map como HashMap, TreeMap, etc., estendem ou implementam AbstractMap.
  • HashMap: Implementação de Map baseada em tabela de dispersão. Não garante a ordem dos elementos.
  • LinkedHashMap: Implementação de Map que mantém a ordem de inserção dos elementos.
  • TreeMap: Implementação de Map baseada em árvore de busca binária que mantém os elementos ordenados de acordo com a ordem natural das chaves ou por um comparador fornecido.
  • WeakHashMap: Implementação de Map que usa referências fracas para as chaves. Isso permite que as chaves sejam coletadas pelo coletor de lixo se não forem referenciadas em nenhum outro lugar.
  • IdentityHashMap: Implementação de Map que usa comparação de identidade em vez de igualdade para comparar chaves.

image

https://www.knowledgefactory.net/2019/10/java-map-interface-hierarchy-examples.html

Para criar um Map, basta seguir esta sintaxe básica, onde TipoChave representa o tipo de dados das chaves e TipoValor representa o tipo de dados dos valores:

Map<TipoChave, TipoValor> nomeDoMap = new HashMap<>();

Agora chega de teoria e vamos partir pra a prática com dois exemplos simples mas que dão uma boa ideia de como utilizar o recurso.

Exemplo 1: Notas dos alunos

Vamos imaginar uma situação em que precisamos armazenar as notas dos alunos usando um Map:

import java.util.*;

public class Main {
  public static void main(String[] args) {
      Map<String, Double> notasDosAlunos = new HashMap<>();
      notasDosAlunos.put("João", 8.5);
      notasDosAlunos.put("Maria", 9.0);
      notasDosAlunos.put("José", 7.5);

      // Acessando valores no Map
      System.out.println("Nota de João: " + notasDosAlunos.get("João"));

      // Iterando sobre os elementos do Map
      for (Map.Entry<String, Double> entrada : notasDosAlunos.entrySet()) {
          System.out.println("Aluno: " + entrada.getKey() + ", Nota: " + entrada.getValue());
      }
  }
}

No exemplo acima, criamos um Map chamado "notasDosAlunos" para armazenar as notas de diferentes alunos. Utilizamos o método put() para adicionar elementos ao Map e o método get() para acessar a nota associada a uma chave específica. Além disso, exploramos a iteração sobre os elementos do Map utilizando um loop for-each e o método entrySet().

Exemplo 2: contagem de itens

Suponha que tenhamos uma lista de nomes de produtos e que desejamos contar quantas vezes cada produto aparece na lista. Suponha também que fizemos uma consulta ao banco de dados para obter a contagem de ocorrências de cada produto. Podemos então armazenar esses resultados em um Map, onde as chaves são os nomes dos produtos e os valores são as contagens correspondentes.

import java.util.HashMap;
import java.util.Map;

public class Main {
  public static void main(String[] args) {
      // Suponha que os resultados da consulta ao banco de dados sejam os seguintes:
      Map<String, Integer> resultadosDoBanco = new HashMap<>();
      resultadosDoBanco.put("Produto A", 5);
      resultadosDoBanco.put("Produto B", 3);
      resultadosDoBanco.put("Produto C", 7);

      // Lista de nomes de produtos
      String[] listaDeProdutos = {"Produto A", "Produto B", "Produto A", "Produto C", "Produto A", "Produto C"};

      // Contagem de ocorrências de cada produto na lista
      Map<String, Integer> contagemDeProdutos = new HashMap<>();
      for (String produto : listaDeProdutos) {
          // Verifica se o produto está presente nos resultados do banco
          if (resultadosDoBanco.containsKey(produto)) {
              // Se estiver, obtém a contagem do banco
              int contagem = resultadosDoBanco.get(produto);
              contagemDeProdutos.put(produto, contagem);
          } else {
              // Caso contrário, inicializa a contagem como 0
              contagemDeProdutos.put(produto, 0);
          }
      }

      // Exibe a contagem de ocorrências de cada produto
      for (Map.Entry<String, Integer> entry : contagemDeProdutos.entrySet()) {
          System.out.println("Produto: " + entry.getKey() + ", Ocorrências: " + entry.getValue());
      }
  }
}

Neste exemplo, a variável resultadosDoBanco simula os resultados da consulta ao banco de dados, onde cada chave é o nome do produto e cada valor é a contagem de ocorrências desse produto. Em seguida, percorremos a lista de produtos e verificamos se o produto está presente nos resultados do banco. Se estiver, obtemos a contagem correspondente; caso contrário, inicializamos a contagem como 0. Finalmente, exibimos a contagem de ocorrências de cada produto.

Importanto observar que nesse exemplo usamos outras estruturas importantes no java. Além do Map, estamos utilizando um Array(String[] listaDeProdutos) e estruturas de controle como o loop for(for (String produto : listaDeProdutos)) e if-else para realizar a contagem de ocorrências de cada produto na lista fornecida, mas a explicação de cada um vai ficar para outra hora! ;)

Um ponto de atenção é que, já que não é possível valores duplicados, ao adicionar uma chave igual à outra que já existe no Map, o valor correspondente será substituído pelo novo.

Outro detalhe que é destacado na documentação quanto aos tipos e valores que podem ser informados:

Algumas implementações de mapas têm restrições quanto às chaves e valores que podem conter. Por exemplo, algumas implementações proíbem chaves e valores nulos e algumas têm restrições quanto aos tipos de suas chaves. (Traduzido)

Conclusão

O Map em Java é uma ferramenta valiosa para organizar e recuperar dados de forma eficiente, tornando-se um aliado essencial para desenvolvedores Java. Neste artigo, exploramos sua sintaxe básica, oferecemos um exemplo prático e elucidamos seu funcionamento. Ao dominar o Map, os programadores Java podem manipular conjuntos de dados associativos com facilidade e eficiência.

Referências:

https://docs.oracle.com/en%2Fjava%2Fjavase%2F11%2Fdocs%2Fapi%2F%2F/java.base/java/util/Map.html

Compartilhe
Comentários (0)