Java で配列に特定の要素が含まれているかどうかを確認する方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Java 配列内に特定の要素が存在するかどうかを、さまざまな手法を用いてチェックする方法を学びます。まず、従来の for ループを使って配列を反復処理し、要素を検索する基本的なアプローチを探ります。

基本的な反復処理方法の後に、Arrays.stream() メソッドを活用して、より簡潔で潜在的に効率的な要素の存在チェック方法を学びます。最後に、検索操作中に配列内の null 要素を扱うという重要な考慮事項について説明します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) 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/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() を使用した要素のチェック

このステップでは、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;: stream() メソッドを使用するために Arrays クラスをインポートする必要があります。
  • 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 を安全に扱う方法を学びましょう。

再度、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;: null を安全に扱うなど、オブジェクトに関するユーティリティメソッドを提供する Objects クラスをインポートします。
  • String[] fruits = {"Apple", null, "Banana", "Cherry", "Date", "Elderberry"};: fruits 配列の 2 番目の要素として null を追加しました。
  • .anyMatch(fruit -> Objects.equals(fruit, searchElement)): fruit.equals(searchElement) の代わりに Objects.equals(fruit, 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 ファイルの作成、配列と検索要素の定義、要素を比較するループの実装、および要素が見つかったかどうかを追跡するためのブール型フラグの使用を練習しました。この実践的な演習を通じて、基本的な検索操作を実行し、要素が配列内に存在するかどうかに基づいて結果を出力する方法を示しました。