Javaで配列に値が含まれるかをチェックする方法

こんにちは、さるまりんです。

タイトルの通り、配列が特定の値を含むかをチェックしてみます。

ListとかSetならばcontains()メソッドを呼ぶことでチェックをできます。
が、配列にはこのメソッドはありません。なので別の方法でチェックをします。
いくつかの方法があるのでまとめておきます。

1. 単純にループを回す

シンプルにループを回して配列の要素を一つずつチェックする方法です。
コードにするとこんな感じです。

String[] fruits = {"apple", "banana", "grape", "melon", "orange", "peach"};

boolean found = false;
String testValue = "grape";
for (String f : fruits) {
    if (testValue.equals(f)) {
        found = true;
        break;
    }
}

System.out.println("found? " + (found ? "yes" : "no"));

fruitsが値を持つ配列、testValueにチェックする値を入れます。
foundtrueになっていれば、fruitstestValueがあるということです。

実行すると

found? yes

と表示されます。

2. Listcontains()メソッドを使う

上にも書いたように配列にはcotains()メソッドはないですがListにはあります。
なので、まず配列からListに変換してからメソッドを使ってチェックします。

コードはこんな感じになります。

String[] fruits = {"apple", "banana", "grape", "melon", "orange", "peach"};
String testValue = "grape";

List<String> listOfFruits = Arrays.asList(fruits);
boolean found = listOfFruits.contains(testValue);

System.out.println("found? " + (found ? "yes" : "no"));

実行すると

found? yes

と表示されます。

3. Stream APIのanyMatch()メソッドを使う

配列からstreamを作って、anyMatch()メソッドでチェックする方法です。

コードにしてみます。

String[] fruits = {"apple", "banana", "grape", "melon", "orange", "peach"};
String testValue = "grape";

boolean found = Arrays.stream(fruits).anyMatch(testValue::equals);

System.out.println("found? " + (found ? "yes" : "no"));

こちらも実行結果は同じ

found? yes

と表示されます。

4. ソート済みのリストをbinarySearch()で探す

ソートされたリストであればArraysクラスのbinarySearch()メソッドで値が含まれているかチェックすることができます。

String[] fruits = {"apple", "banana", "grape", "melon", "orange", "peach"};
String testValue = "grape";

Arrays.sort(fruits); // 配列をソートします。
int index = Arrays.binarySearch(fruits, testValue); // 配列に値があるか?
boolean found = index >= 0; // indexが0以上であれば配列は値を含みます
System.out.println("found? " + (found ? "yes" : "no"));

結果は同じことなんですが、それぞれの方法でコードがシンプルになったり、速度が違ったりすると思うので、適切にやり方を選んでいけたらと思います。

読んでくださってありがとうございました。

それではまた!