Javaの配列内で要素を検索する方法はいくつかある。あまり大きな配列にならない限り、使いやすいものを使えばいいだろう。
このページではJava配列内の検索方法についてまとめている。参考にしていただければと思う。
目次
配列を検索する方法
配列を検索する方法はいくつかある。プログラムのコードはクラスライブラリを使わないで書くこともできるが、Javaのクラスライブラリを使えばスマートに配列を検索できる。
では、配列を検索するために使えるJavaのクラスライブラリの使い方を紹介しよう。
検索に利用できるクラスライブラリ
ここでは、3つのクラスライブラリを紹介する。どれを使うかは、いろいろな場面に応じて使い分けることになる。
Java 標準クラスライブラリ
Java標準のライブラリの中にあるパッケージjava.util.にArraysクラスがある。そのArraysクラスに配列をListクラスのインスタンスに変換してくれるasListクラスメソッドがある。
このメソッドで配列をListに変換して、変換されたListクラスのインスタンスに対してcontainsメソッドで検索を行う。このように二段階のメソッド呼び出しだが、一行で書くこともできる。
書き方はこうだ。
boolean 結果 = Arrays.asList(配列変数名).contains(検索する値)
注意点は、配列は参照型の配列でなくてはならない。プリミティブ型は正しく動作しない。詳細は「クラスライブラリ」のセクションで説明している。
Apache Commons Lang
Apache Commons Langによって提供されるクラスライブラリがある。その中の ArrayUtilsクラスに配列を検索するcontainsクラスメソッドがある。このメソッドを使うと配列の要素を検索することができる。単純に配列を検索するだけなら、標準のクラスライブラリを使うより、このクラスライブラリを使ったほうが簡単だ。
とはいえ、準備としてクラスライブラリをダウンロードして、Javaの開発環境に取り込んでおくことが必要である。
基本的な書き方はこうだ。
boolean 結果 = ArrayUtils. contains (配列, 検索する値)
詳細は「クラスライブラリ」のセクションで説明している。
Java 8 Stream
Java 8で標準クラスライブラリに新たに追加されたjava.util.streamパッケージにStreamクラスがある。その新たなクラスにanyMatchメソッドがある。このメソッドを使うと配列の要素を検索することができる。Streamを使うために配列からStreamに変換する必要がある。しかし、一度Streamに変換すれば他のStreamの新たな機能を使うことができる。
基本的な書き方はこうだ。
boolean 結果 = Stream変数名.anyMatch(検索する値::メソッド)
詳細は「クラスライブラリ」のセクションで説明している。
Arrays.asListを使った配列内検索のサンプルプログラム
それでは実際にサンプルプログラムを確認してみよう。
このサンプルプログラムは一行と二行に分けた書き方の両方を示している。どちらを書いても動作は同じである。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import java.util.Arrays; import java.util.List; public class ArrayContainByUsingJavaAPI { public static void main(String args[]) { String[] array = {"アップル", "バナナ" ,"メロン"};//[1] if (Arrays.asList(array).contains("メロン")) {//[2] System.out.println("[3] 一行で書いた検索:メロンが見つかった"); } List list = Arrays.asList(array);//[4] if (list.contains("メロン")) {//[5] System.out.println("[6] 二行で書いた検索:メロンが見つかった"); return;//[7] } System.out.println("[8] メロンは見つからなかった"); } } |
実行結果
1 2 |
[3] 一行で書いた検索:メロンが見つかった [6] 二行で書いた検索:メロンが見つかった. |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] 配列変数 arrayを宣言し、"アップル"、"バナナ"、"メロン"を代入する。
- [2][3] もし配列変数arrayをListに変換して、Listが"メロン"を含むならば、”一行で書いた検索:メロンが見つかった”を表示する。
- [4] 配列変数arrayをListクラスのオブジェクトに変換し、変数listに代入する。
- [5][6] もしlistの要素に"メロン"が含まれるならば、”二行で書いた検索:メロンが見つかった”を表示する。
- [7] 戻る。
- [8] メロンは見つからなかった”を表示する。
ArrayUtils. containsを使った配列内検索のサンプルプログラム
このサンプルプログラムは、検索する値と検索する対象となる配列をメソッドの引数として渡している。メソッドを呼べば検索の結果が返ってくる。
1 2 3 4 5 6 7 8 9 10 11 12 |
import org.apache.commons.lang3.ArrayUtils; public class ArrayContainsByUsingApacheCommonsLang { public static void main(String args[]) { String[] array = {"アップル", "バナナ" ,"メロン"};//[1] if (ArrayUtils.contains( array, "メロン" )) {//[2] System.out.println("[3] メロンが見つかった"); return;//[4] } System.out.println("[5] メロンは見つからなかった"); } } |
実行結果
1 |
[3] メロンが見つかった |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1]配列変数 arrayを宣言し、"アップル"、"バナナ"、"メロン"を代入する。
- [2][3]もし配列変数arrayの配列の要素を検索して、"メロン"が含まれるならば、”メロンが見つかった”を表示する。
- [4]戻る。
- [5]”メロンは見つからなかった”を表示する。Streamを使ったサンプルプログラム
Streamを使った配列内検索のサンプルプログラム
このサンプルプログラムは、検索したい配列をSteamに変換して検索を行っている。
配列要素がプリミティブ型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import java.util.Arrays; import java.util.stream.Stream; public class ArrayContainsByUsingJava8 { public static void main(String args[]) { String[] array = {"アップル", "バナナ" ,"メロン"};//[1] Stream<String> arrayStream = Arrays.stream(array);//[2] if (arrayStream.anyMatch("メロン"::equals)) {//[3] System.out.println("[4] メロンが見つかった"); return;//[5] } System.out.println("[6] メロンは見つからなかった"); } } |
実行結果
1 |
[4] メロンが見つかった |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] 配列変数 arrayを宣言し、"アップル"、"バナナ"、"メロン"を代入する。
- [2] arrayをStreamクラスのオブジェクトに変換し、変数arrayStreamに代入する。
- [3][4] もし配列変数arrayStreamを検索して"メロン"に一致する要素がみつかったなら、"メロンが見つかった"を表示する。
- [5] 戻る。
- [6] "メロンは見つからなかった"を表示する。
クラスライブラリの詳細
サンプルプログラムの中で使っているふたつのメソッドのAPI仕様を見てみよう。
Arrays.asList
asList(T... a)
戻り値の型 |
public static <T> List<T> |
内容 |
指定された配列が背後にある固定サイズのリストを戻す。(戻されたリストに対する変更は、その配列にライト・スルーされる。)このメソッドは、Collection.toArray()と共同して、配列ベースのAPIs とコレクションベースAPIsとの間のブリッジの働きをする。 戻されたリストは、シリアライズ可能かつRandomAccessを実装する。このメソッドは、またいくつかの要素を含むために初期化された固定サイズのリストを生成するために便利な方法を提供する。 List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
型 引数:T - 配列の中のオブジェクトのクラス
引数:a -リストの背後に置かれることになる配列
戻り値:指定されたリストのヴュー |
List.contains
a contains(Object o))
戻り値の型 |
boolean |
内容 |
もしこのリストが指定された要素を含むなら、trueを戻す。もっと正確には、たとえ、このlistが少なくとも(o==null ? e==null : o.equals(e))のような1つの要素を含むだけでもtrueを戻す。
引数;o - このリストの中の存在がテストされるべき要素。
戻り値:もしこのリストが指定された要素を含むなら、trueを戻す。
例外: ClassCastException -もし指定された要素の型が、このリストと適合しないならば(オプション)。 NullPointerException - もし指定された要素がnullで、このリストがnull要素を許可しないならば(オプション)。 |
ArrayUtils. contains
contains(Object o)
戻り値の型 |
Boolean |
内容 |
もしオブジェクトが渡された配列の中にあるならば、チェックする。 もし、あるnullの配列が渡されるならば、メソッドはfalseを戻す。
引数: array-検索するための配列 objectToFind-見つけるためのオブジェクト
戻り値:もし配列がオブジェクトを含むならば、trueを戻す。 |
Java 8 Stream. anyMatch
anyMatch(Predicate<? super T> predicate)
戻り値の型 |
Boolean |
内容 |
このstreamのいずれかの要素が、提供されたpredicateと一致しているかどうかを戻す。結果を決定するために、もし必要でないならすべての要素についてpredicateを評価しないかもしれない。もしstreamが空ならばfalseが戻され、predicateは評価されない。
これは、途中で終わることがあるオペレーションである。
引数:predicate -このstreamの要素に適用する非干渉でステートレスなpredicate。
戻り値:もしstreamのいずれかの要素が提供されたpredicateと一致しているならば、trueを戻す。そうでなければfalseを戻す。 |
まとめ
このページではJavaでの配列内検索についてまとめてみた。配列内の検索はよく使うロジックだろう。使う時はこのページを確認して、トライしてみていただきたい。