はじめに
この実験では、Java 配列内に特定の要素が存在するかどうかを、さまざまな手法を用いてチェックする方法を学びます。まず、従来の for
ループを使って配列を反復処理し、要素を検索する基本的なアプローチを探ります。
基本的な反復処理方法の後に、Arrays.stream()
メソッドを活用して、より簡潔で潜在的に効率的な要素の存在チェック方法を学びます。最後に、検索操作中に配列内の null 要素を扱うという重要な考慮事項について説明します。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Java 配列内に特定の要素が存在するかどうかを、さまざまな手法を用いてチェックする方法を学びます。まず、従来の for
ループを使って配列を反復処理し、要素を検索する基本的なアプローチを探ります。
基本的な反復処理方法の後に、Arrays.stream()
メソッドを活用して、より簡潔で潜在的に効率的な要素の存在チェック方法を学びます。最後に、検索操作中に配列内の null 要素を扱うという重要な考慮事項について説明します。
このステップでは、従来の 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"
)に変更し、ファイルを保存し、再度コンパイルして実行して、異なる出力を確認してみましょう。
このステップでは、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 ファイルの作成、配列と検索要素の定義、要素を比較するループの実装、および要素が見つかったかどうかを追跡するためのブール型フラグの使用を練習しました。この実践的な演習を通じて、基本的な検索操作を実行し、要素が配列内に存在するかどうかに基づいて結果を出力する方法を示しました。