Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?

java arrays


次のような値を持つ String[] があります。

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

String s 与えられた場合、 VALUESs が含まれているかどうかをテストする良い方法はありますか?




Answer 1 camickr


Arrays.asList(yourArray).contains(yourValue)

警告:これはプリミティブの配列では動作しません (コメントを参照してください)。


java-8以降、Streamsを使用できるようになりました。

String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);

intdouble または long の配列に値が含まれているかどうかを確認するには、それぞれ IntStreamDoubleStream 、または LongStream を使用します。

Example

int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);



Answer 2 Tom Hawtin - tackline


Java SE 9の簡潔なアップデート

参照配列は不良です。この場合、私たちはセットの後です。Java SE 9以降、 Set.of があります。

private static final Set<String> VALUES = Set.of(
    "AB","BC","CD","AE"
);

「与えられた文字列s、VALUESにsが含まれているかどうかをテストする良い方法はありますか?」

VALUES.contains(s)

O(1).

右のタイプ不変O(1)簡潔。綺麗な。*

オリジナル回答の詳細

そもそもコードを明確にするために 訂正しました)。

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

これは突然変異可能なスタティックであり、FindBugs はこれが非常にいたずらなものであることを教えてくれるでしょう。スタティックを変更してはいけませんし、他のコードにも変更させてはいけません。最低限、フィールドは非公開にしてください。

private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

(実際には、 new String[]; ビットをドロップできます。)

参照配列はやはり悪いので、セットが欲しいところです。

private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
     new String[] {"AB","BC","CD","AE"}
));

(私のようなパラノイドの人々は、これが Collections.unmodifiableSet にラップされていれば、より安心できるでしょう。公開することもできます。)

(*ブランドについてもう少し説明しますと、コレクションAPIには、不変のコレクション型がまだ見当たらず、構文はまだ私の好みには冗長すぎます。)




Answer 3 Intracer


あなたは使用することができます ArrayUtils.contains からのApache Commonsのラングを

public static boolean contains(Object[] array, Object objectToFind)

渡された配列が null の場合、このメソッドは false を返すことに注意してください。

あらゆる種類のプリミティブ配列に対応したメソッドも用意されています。

Example:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}



Answer 4 icza


単純に手で実装するだけ。

public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;

    return false;
}

Improvement:

v != null 条件は、メソッド内で一定です。メソッド呼び出し中は常に同じブール値に評価されます。したがって、入力 array が大きい場合は、この条件を1回だけ評価する方が効率的であり、結果に基づいて for ループ内で簡略化/高速化された条件を使用できます。改善さ contains() メソッド:

public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } 
    else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }

    return false;
}



Answer 5 Sireesh Yarlagadda


配列に値が含まれているかどうかをチェックする4つの方法

  1. List 使用:

    public static boolean useList(String[] arr, String targetValue) {
        return Arrays.asList(arr).contains(targetValue);
    }
  2. Set 使用:

    public static boolean useSet(String[] arr, String targetValue) {
        Set<String> set = new HashSet<String>(Arrays.asList(arr));
        return set.contains(targetValue);
    }
  3. シンプルなループを使って

    public static boolean useLoop(String[] arr, String targetValue) {
        for (String s: arr) {
            if (s.equals(targetValue))
                return true;
        }
        return false;
    }
  4. Arrays.binarySearch() の使用:

    以下のコードは間違っています。完全を期すためにここにリストしています。 binarySearch() は、ソートされた配列でのみ使用できます。結果は以下のように奇妙です。これは、配列がソートされる場合の最良のオプションです。

    public static boolean binarySearch(String[] arr, String targetValue) {  
        return Arrays.binarySearch(arr, targetValue) >= 0;
    }

簡単な例

String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false