Ручной перебор значений
На предыдущем этапе мы использовали встроенный метод containsValue()
для проверки наличия значения. Хотя это самый эффективный способ, полезно также понять, как можно вручную проверить наличие значения, перебрав все значения в HashMap
. Этот процесс включает получение коллекции всех значений и последующий поэлементный перебор этой коллекции.
В Java класс HashMap
предоставляет метод values()
, который возвращает представление (Collection
) всех значений, содержащихся в карте. Затем мы можем перебрать эту коллекцию с помощью цикла.
Давайте модифицируем нашу программу, чтобы вручную проверить, существует ли значение 25, перебрав все значения.
-
Откройте файл HelloJava.java
в редакторе WebIDE.
-
Замените существующий код следующим:
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);
}
}
Вот что нового или изменено:
import java.util.Collection;
: Мы импортируем интерфейс Collection
, так как метод ages.values()
возвращает объект типа Collection
.
Collection<Integer> allAges = ages.values();
: Эта строка получает коллекцию, содержащую все целочисленные значения (возрасты) из нашей карты ages
.
for (Integer age : allAges)
: Это расширенный цикл for
(также известный как цикл for-each
), который перебирает каждый элемент типа Integer
в коллекции allAges
. На каждой итерации текущее значение присваивается переменной age
.
if (age.equals(valueToCheck))
: Внутри цикла мы сравниваем текущий age
с valueToCheck
. Мы используем метод equals()
для сравнения объектов (например, Integer
), что в общем случае безопаснее, чем использование оператора ==
для объектов.
foundManually = true;
: Если найдено совпадение, мы устанавливаем foundManually
в true
.
break;
: Эта инструкция немедленно завершает цикл, как только значение найдено, что делает проверку более эффективной.
-
Сохраните файл.
-
Скомпилируйте программу:
javac HelloJava.java
-
Запустите программу:
java HelloJava
Вывод должен быть таким же, как на предыдущем этапе, что подтверждает, что наша ручная проверка работает правильно.
Does the map contain the value 25 (manual check)? true
Does the map contain the value 40 (manual check)? false
Хотя ручной перебор значений работает, использование метода containsValue()
обычно предпочтительнее, так как он более лаконичен и часто оптимизирован по производительности в Java-библиотеке. Однако понимание, как перебирать значения, является фундаментальным навыком, который пригодится во многих других сценариях.