如何在 Java 中检查数组是否包含特定元素

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本次实验中,你将学习如何使用不同的技术来检查 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

通过循环遍历数组查找元素

在这一步中,你将学习如何使用传统的 for 循环遍历 Java 数组,以检查特定元素是否存在。这是在数据集合中进行搜索的基本技术。

首先,在你的 ~/project 目录下创建一个名为 ArraySearch.java 的新 Java 文件。你可以使用左侧的 WebIDE 文件浏览器来完成此操作,也可以在终端中运行以下命令:

touch ~/project/ArraySearch.java

现在,在 WebIDE 编辑器中打开 ArraySearch.java 文件,并添加以下 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。如果在数组中找到了 searchElement,我们会将其设置为 true
  • 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 代码块根据 found 变量的值打印一条消息,指示是否找到了 searchElement

保存 ArraySearch.java 文件(Ctrl+S 或 Cmd+S)。

现在,让我们在终端中编译并运行这个程序。确保你位于 ~/project 目录下。

编译代码:

javac ArraySearch.java

如果没有错误,将会创建一个 ArraySearch.class 文件。

运行编译后的代码:

java ArraySearch

你应该会看到以下输出:

Cherry was found in the array.

现在,尝试将 searchElement 更改为数组中不存在的元素,例如 "Grape",保存文件,重新编译并再次运行,以查看不同的输出。

使用 Arrays.stream() 检查元素

在这一步中,你将学习一种更现代且通常更简洁的方法,即使用流 API(Streams API),特别是 Arrays.stream() 来检查 Java 数组中是否存在某个元素。这种方法利用了函数式编程的概念,对于某些任务而言,可以让你的代码更具可读性。

我们将修改你在上一步中创建的 ArraySearch.java 文件。在 WebIDE 编辑器中打开 ~/project/ArraySearch.java

将现有代码替换为以下内容:

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() 用于检查流中是否有 任何 元素与给定条件匹配。该条件以 lambda 表达式 fruit -> fruit.equals(searchElement) 的形式提供。这个 lambda 表达式会从流中取出每个 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

再次在 WebIDE 编辑器中打开 ~/project/ArraySearch.java 文件。

修改 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"};:我们在 fruits 数组中添加了 null 作为第二个元素。
  • .anyMatch(fruit -> Objects.equals(fruit, searchElement)):我们现在使用 Objects.equals(fruit, searchElement) 代替 fruit.equals(searchElement)Objects.equals() 方法旨在优雅地处理 null 值。如果两个参数都是 null,它将返回 true,并且如果第一个参数(在这种情况下是 fruit)为 null,它可以避免抛出 NullPointerException
  • 我们添加了第二次搜索,以演示如何使用相同的 Objects.equals() 方法在数组中查找 null 本身。

保存 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 文件、定义数组和搜索元素、实现循环以比较元素,以及使用布尔标志来跟踪元素是否被找到。这个实践练习展示了如何执行基本的搜索操作,并根据元素是否存在于数组中输出结果。