Article image

CO

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

Funções em Java: Explorando o Potencial do Map em 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)