Como Verificar se um Mapa Contém um Valor Específico em Java

JavaBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como verificar se um valor específico existe dentro de um HashMap em Java. Exploraremos o conveniente método containsValue() fornecido pela classe HashMap, que determina eficientemente se um valor está presente.

Além disso, examinaremos como iterar manualmente pelos valores do mapa para realizar a verificação, fornecendo uma abordagem alternativa. Finalmente, discutiremos como lidar com valores nulos ao verificar sua presença dentro do mapa.

Usar containsValue() para Verificação de Valor

Nesta etapa, exploraremos como verificar se um valor específico existe dentro de um HashMap em Java. HashMap é uma estrutura de dados muito útil que armazena pares chave-valor. Às vezes, você pode precisar saber se um valor específico está presente no mapa, independentemente de sua chave.

A classe HashMap do Java fornece um método conveniente chamado containsValue() para essa finalidade. Este método recebe um valor como argumento e retorna true se o mapa contiver pelo menos um mapeamento chave-valor onde o valor é igual ao valor especificado. Caso contrário, ele retorna false.

Vamos criar um programa Java simples para demonstrar como usar containsValue().

  1. Abra o arquivo HelloJava.java no editor WebIDE, caso ele ainda não esteja aberto.

  2. Substitua todo o conteúdo do arquivo pelo seguinte código:

    import java.util.HashMap;
    
    public class HelloJava {
        public static void main(String[] args) {
            // Create a HashMap
            HashMap<String, Integer> ages = new HashMap<>();
    
            // Add some key-value pairs
            ages.put("Alice", 30);
            ages.put("Bob", 25);
            ages.put("Charlie", 35);
            ages.put("David", 25); // Another person with age 25
    
            // Check if a specific value exists
            int valueToCheck = 25;
            boolean contains25 = ages.containsValue(valueToCheck);
    
            System.out.println("Does the map contain the value " + valueToCheck + "? " + contains25);
    
            valueToCheck = 40;
            boolean contains40 = ages.containsValue(valueToCheck);
            System.out.println("Does the map contain the value " + valueToCheck + "? " + contains40);
        }
    }

    Vamos analisar as novas partes deste código:

    • import java.util.HashMap;: Esta linha importa a classe HashMap, que precisamos usar.
    • HashMap<String, Integer> ages = new HashMap<>();: Esta linha cria um novo HashMap onde as chaves são String (como nomes) e os valores são Integer (como idades).
    • ages.put("Alice", 30); e linhas semelhantes: Estas linhas adicionam pares chave-valor ao HashMap.
    • int valueToCheck = 25;: Isso declara uma variável inteira valueToCheck e atribui a ela o valor 25.
    • boolean contains25 = ages.containsValue(valueToCheck);: É aqui que usamos o método containsValue(). Ele verifica se o valor armazenado em valueToCheck (que é 25) existe em qualquer lugar nos valores do mapa ages. O resultado (true ou false) é armazenado na variável booleana contains25.
    • System.out.println(...): Estas linhas imprimem os resultados no console.
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. Compile o programa no Terminal:

    javac HelloJava.java

    Se não houver erros, um arquivo HelloJava.class será criado.

  5. Execute o programa compilado:

    java HelloJava

    Você deve ver a saída indicando se os valores 25 e 40 estão presentes no mapa.

    Does the map contain the value 25? true
    Does the map contain the value 40? false

Isso demonstra como você pode verificar facilmente a existência de um valor em um HashMap usando o método containsValue().

Iterar Manualmente Pelos Valores

Na etapa anterior, usamos o método embutido containsValue() para verificar um valor. Embora esta seja a maneira mais eficiente, também é útil entender como você pode verificar manualmente um valor iterando por todos os valores no HashMap. Este processo envolve obter uma coleção de todos os valores e, em seguida, iterar por eles um por um.

O HashMap do Java fornece um método chamado values() que retorna uma visão Collection dos valores contidos no mapa. Podemos então iterar sobre esta Collection usando um loop.

Vamos modificar nosso programa para verificar manualmente se o valor 25 existe, iterando pelos valores.

  1. Abra o arquivo HelloJava.java no editor WebIDE.

  2. Substitua o código existente pelo seguinte:

    import java.util.HashMap;
    import java.util.Collection;
    
    public class HelloJava {
        public static void main(String[] args) {
            // Create a HashMap
            HashMap<String, Integer> ages = new HashMap<>();
    
            // Add some key-value pairs
            ages.put("Alice", 30);
            ages.put("Bob", 25);
            ages.put("Charlie", 35);
            ages.put("David", 25); // Another person with age 25
    
            // Get a collection of all values
            Collection<Integer> allAges = ages.values();
    
            // Manually check if a specific value exists by looping
            int valueToCheck = 25;
            boolean foundManually = false;
    
            for (Integer age : allAges) {
                if (age.equals(valueToCheck)) {
                    foundManually = true;
                    break; // Exit the loop once the value is found
                }
            }
    
            System.out.println("Does the map contain the value " + valueToCheck + " (manual check)? " + foundManually);
    
            valueToCheck = 40;
            foundManually = false; // Reset for the next check
    
            for (Integer age : allAges) {
                 if (age.equals(valueToCheck)) {
                    foundManually = true;
                    break;
                }
            }
             System.out.println("Does the map contain the value " + valueToCheck + " (manual check)? " + foundManually);
        }
    }

    Aqui está o que é novo ou foi alterado:

    • import java.util.Collection;: Importamos a interface Collection porque ages.values() retorna uma Collection.
    • Collection<Integer> allAges = ages.values();: Esta linha obtém uma Collection contendo todos os valores inteiros (idades) do nosso mapa ages.
    • for (Integer age : allAges): Este é um loop for aprimorado (também conhecido como loop for-each) que itera por cada elemento Integer na coleção allAges. Em cada iteração, o valor atual é atribuído à variável age.
    • if (age.equals(valueToCheck)): Dentro do loop, comparamos a age atual com o valueToCheck. Usamos equals() para comparar objetos (como Integer), o que é geralmente mais seguro do que usar == para objetos.
    • foundManually = true;: Se uma correspondência for encontrada, definimos foundManually como true.
    • break;: Esta instrução sai do loop imediatamente assim que o valor é encontrado, tornando a verificação mais eficiente.
  3. Salve o arquivo.

  4. Compile o programa:

    javac HelloJava.java
  5. Execute o programa:

    java HelloJava

    A saída deve ser a mesma da etapa anterior, confirmando que nossa verificação manual funciona corretamente.

    Does the map contain the value 25 (manual check)? true
    Does the map contain the value 40 (manual check)? false

Embora a iteração manual funcione, usar containsValue() é geralmente preferível porque é mais conciso e, muitas vezes, otimizado para desempenho dentro da biblioteca Java. No entanto, entender como iterar pelos valores é uma habilidade fundamental que será útil em muitos outros cenários.

Lidar com Valores Nulos

Em Java, null é um valor especial que significa "nenhum objeto". É importante entender como o HashMap lida com valores null e como containsValue() se comporta ao lidar com null.

Um HashMap em Java pode armazenar valores null. Você pode adicionar um mapeamento onde o valor é null.

Vamos modificar nosso programa para incluir um valor null e ver como containsValue() funciona com ele.

  1. Abra o arquivo HelloJava.java no editor WebIDE.

  2. Substitua o código existente pelo seguinte:

    import java.util.HashMap;
    
    public class HelloJava {
        public static void main(String[] args) {
            // Create a HashMap
            HashMap<String, Integer> ages = new HashMap<>();
    
            // Add some key-value pairs, including a null value
            ages.put("Alice", 30);
            ages.put("Bob", 25);
            ages.put("Charlie", null); // Charlie's age is unknown (null)
            ages.put("David", 25);
    
            // Check if a specific value exists, including null
            int valueToCheck = 25;
            boolean contains25 = ages.containsValue(valueToCheck);
            System.out.println("Does the map contain the value " + valueToCheck + "? " + contains25);
    
            Integer nullValue = null;
            boolean containsNull = ages.containsValue(nullValue);
            System.out.println("Does the map contain the value null? " + containsNull);
    
            valueToCheck = 40;
            boolean contains40 = ages.containsValue(valueToCheck);
            System.out.println("Does the map contain the value " + valueToCheck + "? " + contains40);
        }
    }

    Aqui está a principal mudança:

    • ages.put("Charlie", null);: Adicionamos um mapeamento onde a chave "Charlie" está associada a um valor null.
    • Integer nullValue = null;: Criamos uma variável Integer e atribuímos a ela o valor null.
    • boolean containsNull = ages.containsValue(nullValue);: Usamos containsValue() para verificar se o mapa contém o valor null.
  3. Salve o arquivo.

  4. Compile o programa:

    javac HelloJava.java
  5. Execute o programa:

    java HelloJava

    Observe a saída, especialmente a linha que verifica null.

    Does the map contain the value 25? true
    Does the map contain the value null? true
    Does the map contain the value 40? false

Como você pode ver, containsValue() identifica corretamente que o HashMap contém o valor null porque o adicionamos explicitamente. Isso confirma que o HashMap pode armazenar valores null e que containsValue() pode ser usado para verificar sua presença.

Lidar com valores null é um aspecto importante da programação Java. Esteja sempre atento se suas estruturas de dados podem conter null e como seu código se comportará nesses casos.

Resumo

Neste laboratório, aprendemos como verificar se um HashMap contém um valor específico em Java. O método principal explorado foi containsValue(), que fornece uma maneira direta de determinar a presença de um valor dentro do mapa. Vimos como usar este método com um exemplo simples, demonstrando seu valor de retorno com base na existência ou não do valor alvo no mapa.

Também exploramos métodos alternativos para verificar a existência de valores, como iterar manualmente pelos valores do mapa. Além disso, o laboratório abordou como lidar com valores nulos ao verificar sua presença no mapa, garantindo uma compreensão abrangente da verificação de valores em HashMap.