Как проверить, содержит ли массив в Java определенный элемент

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии (LabEx) вы научитесь проверять, существует ли определенный элемент в массиве Java, используя различные методы. Мы начнем с изучения основного подхода, который заключается в переборе элементов массива с помощью традиционного цикла for для поиска нужного элемента.

После рассмотрения базового метода перебора вы узнаете, как использовать метод Arrays.stream() для более компактного и, возможно, более эффективного способа проверки наличия элемента. Наконец, мы рассмотрим важный аспект - обработку нулевых (null) элементов в массиве во время операций поиска.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java/BasicSyntaxGroup -.-> java/for_loop("For Loop") java/StringManipulationGroup -.-> java/strings("Strings") java/DataStructuresGroup -.-> java/arrays("Arrays") java/DataStructuresGroup -.-> java/arrays_methods("Arrays Methods") java/FileandIOManagementGroup -.-> java/stream("Stream") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/for_loop -.-> lab-559997{{"Как проверить, содержит ли массив в Java определенный элемент"}} java/strings -.-> lab-559997{{"Как проверить, содержит ли массив в Java определенный элемент"}} java/arrays -.-> lab-559997{{"Как проверить, содержит ли массив в Java определенный элемент"}} java/arrays_methods -.-> lab-559997{{"Как проверить, содержит ли массив в Java определенный элемент"}} java/stream -.-> lab-559997{{"Как проверить, содержит ли массив в Java определенный элемент"}} java/object_methods -.-> lab-559997{{"Как проверить, содержит ли массив в Java определенный элемент"}} end

Перебор массива в поисках элемента

На этом этапе вы научитесь проверять, существует ли определенный элемент в массиве 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-файла, определении массива и элемента для поиска, реализации цикла для сравнения элементов и использовании булевой переменной (флага) для отслеживания, был ли найден элемент. Эта практическая задача показала, как выполнять базовую операцию поиска и выводить результат в зависимости от того, присутствует ли элемент в массиве.