Javaで配列に特定の値が含まれているか確認する3つの方法(for-each・contains()・stream())
Javaで配列を扱っていると、「この配列に特定の値が含まれているかどうか」を確認したい場面に出くわすことがあります。
たとえば、今シーズンのバードウォッチングの記録を管理するプログラムを作っているなら、「ある鳥の種類をすでに観察済みかどうか」をチェックする機能が必要になるかもしれません。
配列に特定の値が含まれているかを調べるには、いくつかの方法があります。本記事では、for-eachループ、contains()、stream()という3つの手法を、具体的なコード例とともにわかりやすく解説します。
この記事を読み終える頃には、Javaプログラムで配列に特定の値が含まれているかをプロの開発者のように判定できるようになっているはずです。
Javaにおける配列の基礎
Javaにおいて、配列とは同一の型のデータを格納するためのコンテナです。たとえば、今年の庭でのバードウォッチングで観察した14種類の鳥の名前一覧を配列に格納できます。この場合、配列には14個の文字列(String)値が入ることになります。
配列は重要なデータ型です。多数の値を1つの変数にまとめて格納できるため、値ごとに別々の変数を用意するよりも効率的で、プログラムの可読性も保ちやすくなります。
以下は、Javaで配列を宣言する例です。
String[] bagelShops;
bagelShops = new String[4];
この例では、文字列を格納するためのbagelShopsという配列を宣言し、4つの文字列を保持できるように定義しています。続いて、4つのベーグル店の名前をこの配列に代入するコードを見てみましょう。
String[] bagelShops = {"Absolute Bagels", "Bo's Bagels", "Brooklyn Bagel and Coffee Company", "Forest Hills Bagel"};
では、配列に特定の値が含まれているかを確認するには、どうすればよいのでしょうか。たとえば、「お気に入りのベーグル店リストにForest Hills Bagelが含まれているか」を調べたい場合を考えてみます。ここからは、使えるいくつかのアプローチを詳しく見ていきましょう。
方法1:for-eachループを使う
for-eachループ(拡張forループとも呼ばれます)は、配列やコレクション内のすべての要素を順番に処理できるforループの一種です。たとえば、コインコレクションの全コインが格納された配列を、for-eachループで1枚ずつ処理するといった使い方ができます。
配列に特定の値が含まれているかを確認するには、for-eachループで配列の全要素を走査し、各要素が検索対象の値と一致するかどうかをチェックします。
ここで、ニューヨークのお気に入りベーグル店のリストに「Absolute Bagels」が含まれているかを確認したいとします。次のようなシンプルなループで実現できます。
class Main {
public static void main(String[] args) {
String[] bagelShops = {"Absolute Bagels", "Bo's Bagels", "Brooklyn Bagel and Coffee Company", "Forest Hills Bagel"};
String shopToFind = "Absolute Bagels";
boolean found = false;
for (String shop : bagelShops) {
if (shop.equals(shopToFind)) {
found = true;
break;
}
}
if (found) {
System.out.println("Absolute Bagelsはお気に入りのベーグル店リストに含まれています!");
} else {
System.out.println("Absolute Bagelsはお気に入りのベーグル店リストに含まれていません。");
}
}
}
実行結果:
Absolute Bagelsはお気に入りのベーグル店リストに含まれています!
コードの内容を分解して見ていきましょう。まず、ニューヨークのお気に入りベーグル店4店舗を格納するbagelShopsという配列を宣言します。
次に、検索したい値「Absolute Bagels」を格納するshopToFind変数を宣言します。さらに、リスト内に該当の店が見つかったかどうかを記録するためのboolean型変数foundを用意します。
その後、bagelShopsリストの全要素を走査するfor-eachループを開始します。ループ内ではif文を使って、各要素(shop)がshopToFind変数の値と一致するかどうかをequals()メソッドで比較しています。文字列の比較には==(参照比較)ではなくequals()(内容比較)を使うのが正しい書き方なので注意しましょう。
条件がtrueと評価されればfoundがtrueになり、break文によってループを抜けます。falseの場合は、if文の中の処理は実行されません。
プログラムの最後で、foundがtrueであれば「Absolute Bagelsはお気に入りのベーグル店リストに含まれています!」とコンソールに出力され、そうでなければ「〜含まれていません。」が出力されます。
この手法は数値のリストにもそのまま応用できます。数値のリストに特定の数値が含まれているかを調べたい場合も、上の例とほぼ同じコードで対応可能です(文字列の代わりに数値を使います)。
方法2:contains()メソッドを使う
Javaでは、contains()メソッドを使って配列に特定の値が含まれているかを確認することもできます。contains()は引数を1つだけ受け取ります。それは「配列の中から探したい値」です。
なお、配列自体にはcontains()メソッドは用意されていないため、Arrays.asList()で配列をリストに変換してから呼び出すのが一般的です。また、contains()による直接の判定は主に文字列のリストに向いており、数値を探したい場合は前述のfor-eachループの手法を使うとよいでしょう。
ここで、お気に入りのバンドのリストに「Beatles」が含まれているかを確認したいとします。次のコードで実現できます。
import java.util.Arrays;
class Main {
public static void main(String[] args) {
String[] favoriteBands = {"Beatles", "Revivalists", "Jonas Brothers"};
String favoriteToFind = "Beatles";
boolean found = Arrays.asList(favoriteBands).contains(favoriteToFind);
if (found) {
System.out.println("Beatlesはお気に入りのバンドリストに含まれています!");
} else {
System.out.println("Beatlesはお気に入りのバンドリストに含まれていません。");
}
}
}
実行結果:
Beatlesはお気に入りのバンドリストに含まれています!
コードを分解してみましょう。まず、お気に入りバンド名のリストを格納するfavoriteBandsという配列を宣言します。次に、検索したいバンド名を格納するfavoriteToFind変数を宣言します。
続く行では、Arrays.asList()で配列をリストに変換した上でcontains()を呼び出し、favoriteBandsにfavoriteToFindの値(この例では「Beatles」)が含まれているかを判定しています。その結果(trueまたはfalse)は、boolean型のfound変数に代入されます。
foundがtrueであれば「Beatlesはお気に入りのバンドリストに含まれています!」が、そうでなければ「〜含まれていません。」がコンソールに出力されます。
方法3:stream()メソッドを使う
JavaのArraysユーティリティ(java.util.Arrays)には、配列を操作するためのさまざまな関数が用意されています。そのひとつがstream()です。stream()とanyMatch()メソッドを組み合わせることで、配列に特定の値が含まれているかを簡潔に判定できます。
ここで、友人のAdaが好きなTV番組のリストに『Parks and Recreation』が含まれているかを調べたいとします。次のコードで確認できます。
import java.util.Arrays;
class Main {
public static void main(String[] args) {
String[] favoriteShows = {"Billions", "Silicon Valley", "Superstore"};
String showToFind = "Parks and Recreation";
boolean found = Arrays.stream(favoriteShows).anyMatch(show -> show.equals(showToFind));
if (found) {
System.out.println("Parks and RecreationはAdaのお気に入りTV番組リストに含まれています。");
} else {
System.out.println("Parks and RecreationはAdaのお気に入りTV番組リストに含まれていません。");
}
}
}
実行結果:
Parks and RecreationはAdaのお気に入りTV番組リストに含まれていません。
コードの流れを見ていきましょう。まず、import java.util.Arrays;でArraysパッケージをインポートします。
次に、Adaのお気に入りTV番組リストを格納するfavoriteShowsという配列を宣言します。続いて、探したい番組名を格納するshowToFind変数を宣言し、ここでは「Parks and Recreation」という値を代入します。
そして、Arrays.stream()とanyMatch()を組み合わせて、showToFindに格納された値がfavoriteShows配列内に存在するかどうかを判定します。これらのメソッドはtrueまたはfalseを返し、その結果がboolean型のfound変数に代入されます。
foundがtrueであれば「Parks and RecreationはAdaのお気に入りTV番組リストに含まれています。」が、そうでなければ「〜含まれていません。」がコンソールに出力されます。
まとめ
配列に特定の値が含まれているかを確認することは、Java開発でよく行われる操作のひとつです。主な確認方法は次の3つです。
- for-eachループ:あらゆる型の配列に使える万能な方法
- contains():リスト化した配列に対して手軽に使える方法
- stream()+anyMatch():モダンで簡潔に書ける方法
本記事では、具体例を交えながらJavaの配列に特定の値が含まれているかを確認する方法を解説しました。これであなたも、プロの開発者のようにJava配列の値の有無をチェックできるようになったはずです!
-
JavaのArrayIndexOutOfBoundsExceptionとは?発生原因と対処法を解説
配列とインデックスの基本 配列(Array)とは、同じ型の要素を固定サイズで順番に格納するためのデータ構造(コンテナ/オブジェクト)です。配列のサイズ(長さ)は生成時に決定され、後から変更することはできません。 配列内の各要素の位置は「インデックス(添字)」と呼ばれます。Javaの配列は0始まりのため、最初の要素はインデックス0、2番目の要素はインデックス1、というように順に番号が割り当てられます。 配列の各要素へは、「配列名[インデックス]」という形式の式を使ってアクセスします。 System.out.println(myArray[3]); // 1457 が出力される たとえばサイズ7
-
JavaでList(リスト)を配列に変換する方法|toArray()とArrays.asList()の使い方
Javaの開発において、List(リスト)と配列(Array)の相互変換は非常によく使われる基本的な操作です。 Listを配列に変換する最も簡単かつ推奨される方法は、.toArray()メソッドを使うことです。逆に、配列をListに戻したい場合は、Arrays.asList()メソッドを使用します。 以下では、文字列(String)のListや整数(Integer)のListを、それぞれ対応する配列に変換する具体例を紹介します。 String型のListを配列に変換する import java.util.ArrayList; import java.util.List; public cl