Введение
В этом лабораторном занятии (LabEx) вы научитесь проверять, существует ли определенный элемент в массиве Java, используя различные методы. Мы начнем с изучения основного подхода, который заключается в переборе элементов массива с помощью традиционного цикла for для поиска нужного элемента.
После рассмотрения базового метода перебора вы узнаете, как использовать метод Arrays.stream() для более компактного и, возможно, более эффективного способа проверки наличия элемента. Наконец, мы рассмотрим важный аспект - обработку нулевых (null) элементов в массиве во время операций поиска.
Перебор массива в поисках элемента
На этом этапе вы научитесь проверять, существует ли определенный элемент в массиве Java, перебирая его с помощью традиционного цикла for. Это фундаментальный метод поиска в коллекциях данных.
Сначала создадим новый Java-файл с именем ArraySearch.java в каталоге ~/project. Вы можете сделать это с помощью проводника файлов WebIDE слева или выполнив следующую команду в терминале:
touch ~/project/ArraySearch.java
Теперь откройте файл ArraySearch.java в редакторе WebIDE и добавьте следующий Java-код:
public class ArraySearch {
public static void main(String[] args) {
// Define an array of strings
String[] fruits = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};
// The element we want to search for
String searchElement = "Cherry";
// Variable to keep track if the element is found
boolean found = false;
// Loop through the array
for (int i = 0; i < fruits.length; i++) {
// Check if the current element is equal to the search element
if (fruits[i].equals(searchElement)) {
found = true; // Element found
break; // Exit the loop since we found the element
}
}
// Print the result
if (found) {
System.out.println(searchElement + " was found in the array.");
} else {
System.out.println(searchElement + " was not found in the array.");
}
}
}
Разберем этот код:
String[] fruits = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};: Эта строка объявляет и инициализирует строковый массив с именемfruits, содержащий несколько названий фруктов.String searchElement = "Cherry";: Эта строка объявляет строковую переменнуюsearchElementи присваивает ей значение "Cherry". Это элемент, который мы ищем в массиве.boolean found = false;: Эта строка объявляет булеву переменнуюfoundи инициализирует ее значениемfalse. Мы установим ее вtrue, если найдемsearchElementв массиве.for (int i = 0; i < fruits.length; i++): Это стандартный циклfor, который перебирает элементы массива.iначинается с 0 и увеличивается до (но не включая) длины массиваfruits.if (fruits[i].equals(searchElement)): Внутри цикла это условиеifпроверяет, равен ли текущий элемент массива (fruits[i])searchElement. В Java для сравнения строк используется метод.equals(), а не оператор==.found = true;: Если элементы равны, мы устанавливаем переменнуюfoundвtrue.break;: Как только элемент найден, мы используем операторbreakдля выхода из цикла досрочно, так как нет необходимости продолжать поиск.- Последний блок
if/elseвыводит сообщение, указывающее, был ли найденsearchElement, в зависимости от значения переменнойfound.
Сохраните файл ArraySearch.java (Ctrl+S или Cmd+S).
Теперь скомпилируем и запустим программу в терминале. Убедитесь, что вы находитесь в каталоге ~/project.
Скомпилируйте код:
javac ArraySearch.java
Если нет ошибок, будет создан файл ArraySearch.class.
Запустите скомпилированный код:
java ArraySearch
Вы должны увидеть следующий вывод:
Cherry was found in the array.
Теперь попробуйте изменить searchElement на что-то, чего нет в массиве, например "Grape", сохраните файл, перекомпилируйте и запустите программу снова, чтобы увидеть другой вывод.
Использование Arrays.stream() для проверки наличия элемента
На этом этапе вы научитесь более современному и часто более компактному способу проверки наличия элемента в массиве Java с использованием Streams API, а именно метода Arrays.stream(). Этот подход основан на концепциях функционального программирования и может сделать ваш код более читаемым для определенных задач.
Мы изменим файл ArraySearch.java, который вы создали на предыдущем этапе. Откройте файл ~/project/ArraySearch.java в редакторе WebIDE.
Замените существующий код следующим:
import java.util.Arrays;
public class ArraySearch {
public static void main(String[] args) {
// Define an array of strings
String[] fruits = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};
// The element we want to search for
String searchElement = "Cherry";
// Use Arrays.stream() to check if the element exists
boolean found = Arrays.stream(fruits).anyMatch(fruit -> fruit.equals(searchElement));
// Print the result
if (found) {
System.out.println(searchElement + " was found in the array.");
} else {
System.out.println(searchElement + " was not found in the array.");
}
}
}
Рассмотрим изменения:
import java.util.Arrays;: Мы должны импортировать классArrays, чтобы использовать его методstream().boolean found = Arrays.stream(fruits).anyMatch(fruit -> fruit.equals(searchElement));: Это ядро нового подхода.Arrays.stream(fruits): Этот метод преобразует массивfruitsв поток (Stream). Поток представляет собой последовательность элементов, поддерживающую различные операции..anyMatch(fruit -> fruit.equals(searchElement)): Это операция над потоком. МетодanyMatch()проверяет, соответствует ли любой элемент потока заданному условию. Условие задается в виде лямбда-выраженияfruit -> fruit.equals(searchElement). Это лямбда-выражение принимает каждый элементfruitиз потока и проверяет, равен ли онsearchElement. Если совпадение найдено, методanyMatch()сразу возвращаетtrue.
Этот подход, основанный на потоках, дает такой же результат, как и цикл for, но в более декларативном стиле – вы описываете что вы хотите сделать (найти, соответствует ли какой-либо элемент условию), а не как это сделать (перебирать элементы пошагово).
Сохраните файл ArraySearch.java (Ctrl+S или Cmd+S).
Теперь скомпилируйте и запустите модифицированную программу в терминале из каталога ~/project:
Скомпилируйте код:
javac ArraySearch.java
Запустите скомпилированный код:
java ArraySearch
Вы должны увидеть такой же вывод, как и раньше:
Cherry was found in the array.
Снова не стесняйтесь изменить searchElement, чтобы проверить случай else.
Обработка нулевых элементов
На этом этапе мы рассмотрим распространенный сценарий в Java: работа с значениями null в массивах. Если массив содержит элементы со значением null, наши предыдущие методы могут столкнуться с проблемами. Мы научимся безопасно обрабатывать null при поиске элемента.
Откройте снова файл ~/project/ArraySearch.java в редакторе WebIDE.
Измените массив fruits, добавив в него элемент со значением null:
import java.util.Arrays;
import java.util.Objects; // Import the Objects class
public class ArraySearch {
public static void main(String[] args) {
// Define an array of strings with a null element
String[] fruits = {"Apple", null, "Banana", "Cherry", "Date", "Elderberry"};
// The element we want to search for
String searchElement = "Cherry";
// Use Arrays.stream() and handle nulls
boolean found = Arrays.stream(fruits)
.anyMatch(fruit -> Objects.equals(fruit, searchElement)); // Use Objects.equals
// Print the result
if (found) {
System.out.println(searchElement + " was found in the array.");
} else {
System.out.println(searchElement + " was not found in the array.");
}
// Let's also search for null itself
String searchNullElement = null;
boolean foundNull = Arrays.stream(fruits)
.anyMatch(fruit -> Objects.equals(fruit, searchNullElement));
if (foundNull) {
System.out.println("null was found in the array.");
} else {
System.out.println("null was not found in the array.");
}
}
}
Вот что мы изменили:
import java.util.Objects;: Мы импортируем классObjects, который предоставляет вспомогательные методы для работы с объектами, включая безопасную обработкуnull.String[] fruits = {"Apple", null, "Banana", "Cherry", "Date", "Elderberry"};: Мы добавилиnullв качестве второго элемента в массивfruits..anyMatch(fruit -> Objects.equals(fruit, searchElement)): Вместоfruit.equals(searchElement)мы теперь используемObjects.equals(fruit, searchElement). МетодObjects.equals()разработан для корректной обработки значенийnull. Он возвращаетtrue, если оба аргумента равныnull, и не вызывает исключениеNullPointerException, если первый аргумент (в данном случаеfruit) равенnull.- Мы добавили второй поиск, чтобы показать, как найти
nullв массиве с использованием того же методаObjects.equals().
Сохраните файл ArraySearch.java (Ctrl+S или Cmd+S).
Скомпилируйте и запустите модифицированную программу в терминале из каталога ~/project:
Скомпилируйте код:
javac ArraySearch.java
Запустите скомпилированный код:
java ArraySearch
Вы должны увидеть следующий вывод, показывающий, что и "Cherry", и null были найдены:
Cherry was found in the array.
null was found in the array.
Использование Objects.equals() является рекомендуемым способом сравнения объектов, особенно когда есть возможность, что один или оба объекта могут быть равны null. Это предотвращает неожиданные ошибки NullPointerException.
Резюме
В этом практическом занятии (лабораторной работе) вы изучили фундаментальный метод проверки наличия определенного элемента в массиве Java: перебор элементов массива с использованием традиционного цикла for. Вы практиковались в создании Java-файла, определении массива и элемента для поиска, реализации цикла для сравнения элементов и использовании булевой переменной (флага) для отслеживания, был ли найден элемент. Эта практическая задача показала, как выполнять базовую операцию поиска и выводить результат в зависимости от того, присутствует ли элемент в массиве.



