はじめに
この実験では、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")に変更し、ファイルを保存し、再度コンパイルして実行して、異なる出力を確認してみましょう。
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 のケースをテストしてみてください。
null 要素を処理する
このステップでは、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 ファイルの作成、配列と検索要素の定義、要素を比較するループの実装、および要素が見つかったかどうかを追跡するためのブール型フラグの使用を練習しました。この実践的な演習を通じて、基本的な検索操作を実行し、要素が配列内に存在するかどうかに基づいて結果を出力する方法を示しました。



