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


2277

私はそのString[]ような値を持っています:

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

与えられたString s、をVALUES含むsかどうかをテストする良い方法はありますか?


5
長い道のりですが、forループを使用できます: "for(String s:VALUES)if(s.equals(" MYVALUE "))return true;
Zack

70
@camickr。あなたの質問に対して、私はこの質問とあなたの答えに賛成しました-私は30分と20行のコードをループのための醜いものを書くために節約しました-今-。3年前に読んでいない。(BTW、ありがとう:))
追跡

3
@camickr-私はこれとほぼ同じ状況にあります:stackoverflow.com/a/223929/12943 それはただ投票を得続けていますが、それでもサンのドキュメントからのコピー/貼り付けでした。スコアは、あなたがどれだけの手助けをしたかではなく、どれだけの労力を費やしたかに基づいていると思います。たぶん私たちはジョン・スキートの秘密に遭遇しました!良い答えです。+ 1してください。
Bill K

1
Apache Commonsを使用している場合は、org.apache.commons.lang.ArrayUtils.contains()がこれを行います。
ボーイ氏

34
@camickrは、私のような人々がGoogleで質問し、SOの結果をクリックして、回答を確認し、テストして、機能することを確認し、回答に賛成票を投じてから去ります。
Aequitas、2015

回答:


2924
Arrays.asList(yourArray).contains(yourValue)

警告:これはプリミティブの配列では機能しません(コメントを参照)。


以来 Streamsを使用できるようになりました。

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

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

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

87
これのパフォーマンスと、Arraysクラスの検索関数の比較、または配列の反復処理と、プリミティブにequals()関数または==を使用することについては、少し不思議です。
トーマスオーウェンス

186
asList()は、中心に配列を持つArrayListを返すので、多くを失うことはありません。コンストラクタは参照を変更するだけなので、そこで行う作業はそれほど多くありません。また、contains()/ indexOf()は、equals()を繰り返し使用します。ただし、プリミティブについては、自分でコーディングする方がよいでしょう。文字列または他のクラスの場合、違いは目立ちません。
ジョーイ

18
奇妙なことに、NetBeansは、 'Array [asList(holidays)' for 'int [] holidays'は 'list <int []>'を返し、 'list <int>'は返さないと主張しています。1つの要素のみが含まれています。要素が1つしかないため、Containsは機能しません。int配列。
Nyerguds、2010年

62
Nyerguds:実際、これはプリミティブでは機能しません。Javaでは、プリミティブ型をジェネリックにすることはできません。asListは、<T> List <T> asList(T ...)として宣言されます。int []をそれに渡すと、プリミティブはジェネリックではないため、T = intを推測できないため、コンパイラーはT = int []を推測します。
CromTheDestroyer

28
@Joeyは副次的な注意です。これはですが、期待どおりではありArrayListません。java.util.ArrayList返される実際のクラスは次のようにjava.util.Arrays.ArrayList<E>定義されますpublic class java.util.Arrays {private static class ArrayList<E> ... {}}
TWiStErRob 2012年

362

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"};

これは変更可能なstaticであり、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には、不変のコレクション型がまだ見当たらないことが予想され、構文は、私の好みではまだ非常に冗長です。)


184
そもそもコレクションを作成するのはO(N)だということを除いて:)
Drew Noakes '25

61
静的な場合は、おそらく何度も使用されます。したがって、セットを初期化するために費やされる時間は、多くの線形検索のコストと比較してかなり小さい可能性があります。
Xr。

1
次に、コレクションの作成は、コードの読み込み時間(技術的にはO(n)ですが、実際には一定です)によって支配されます。
トム・ホーティン-タックライン

2
@ TomHawtin-tacklineなぜ「特にここではセットが欲しい」と言うのですか?この場合のセット(HashSet)の利点は何ですか?「参照配列」が悪いのはなぜですか(「参照配列」とは、への呼び出しによって生成された配列に基づくArrayListを意味しますArrays.asListか)?
バジルブルク2014

6
@nmr A TreeSetはになりますO(log n)HashSetsは、バケット内の要素の平均数がほぼ一定になるようにスケーリングされます。少なくとも2 ^ 30までの配列の場合。たとえば、big-O分析が無視するハードウェアキャッシュの影響があるかもしれません。また、ハッシュ関数が効果的に機能していると想定しています。
トムホーティン-タックライン

206

Apache Commons LangArrayUtils.containsから使用できます

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

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

すべての種類のプリミティブ配列に使用できるメソッドもあります。

例:

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

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

4
@ max4ever私は同意しますが、これは「独自のロール」よりも優れており、生のJavaの方法よりも読みやすくなっています。
Jason


38
@ max4ever(他の理由で)このライブラリが既に含まれている場合があり、これは完全に有効な回答です。私はこれを探していましたが、すでにApache Commons Langに依存しています。この回答をありがとう。
GuiSim 14

1
または、メソッド(および依存関係がある場合は依存関係)をコピーすることもできます。
Buffalo

10
@ max4everほとんどのAndroidアプリはProguardによって最小化され、必要なクラスと関数のみをアプリに配置します。それはあなた自身のものを転がすこと、またはApacheのソースをコピーすることと同じになります。そして、その最小化を使用しない人は、700kbまたは78kbについて文句を言う必要はありません:)
Kenyakorn Ketsombut

158

単に手で実装するだけです:

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;
}

改善:

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;
}

9
@Phoexoこのソリューションは明らかに受け入れられた回答が配列をリストにラップし、そのリストのcontains()メソッドを呼び出すため、より高速です。
icza

10
@AlastorMoody e == vは、非常に高速な参照等価チェックを行います。同じオブジェクト(参照によって同じ)が配列内にある場合、より速く検出されます。同じインスタンスではない場合でも、equals()メソッドで要求されたものと同じである可能性があります。これは、参照が同じでない場合にチェックされるものです。
icza 2013年

20
この関数がJavaの一部ではないのはなぜですか?Javaが肥大化していると人々が言うのも不思議ではありません... forループだけが必要なときにライブラリの束を使用する、上記のすべての答えを見てください。最近の子供たち!
phreakhead 2013

4
@phreakheadこれはJavaの一部です。参照Collection.contains(Object)
Steve Kuo

11
@iczaあなたはのソースを見ればArraysArrayList、これが必ずしも速く使用したバージョン以上であることが判明Arrays.asList(...).contains(...)。を作成するオーバーヘッドArrayListは非常に小さく、ArrayList.contains()上に示したもの(JDK 7)よりもスマートなループ(実際には2つの異なるループを使用)を使用します。
アクセル

72

配列に値が含まれているかどうかを確認する4つの方法

1)リストの使用:

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

2)セットの使用:

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) {  
            int a = Arrays.binarySearch(arr, targetValue);
            return a > 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

5
バイナリ検索の例は> 0を返す必要があります。
シャーウッド

6
どうして?0は配列の先頭に含まれていることを示すので、> -1を返す必要があると思います。
2016年

1
の最初のバリアント(a >= 0)は正しかった、単にdocsを確認しください。「これにより、キーが見つかった場合にのみ、戻り値が0以上になることが保証されることに注意してください。」
Yoory N. 2017

なぜintではなくStringで動作するのですか?static boolean exists(int [] ints、int k){return Arrays.asList(ints).contains(k); }
Willians Martins

71

配列が並べ替えられていない場合は、すべてを反復処理し、それぞれに対してequalsを呼び出す必要があります。

配列がソートされている場合、バイナリ検索を実行できます。Arraysクラスに1つあります。

一般的に言えば、多数のメンバーシップチェックを行う場合は、すべてを配列ではなくセットに格納することをお勧めします。


1
また、私の回答で述べたように、Arraysクラスを使用する場合は、配列を並べ替えてから、新しく並べ替えられた配列に対してバイナリ検索を実行できます。
トーマスオーウェンス

1
@トーマス:同意する。または、すべてをTreeSetに追加することもできます。同じ複雑さ。配列が変更されない場合は、配列を使用します(文字列は連続していないが参照が連続して配置されているため、メモリの局所性を少し節約できる可能性があります)。これが時間とともに変化する場合は、このセットを使用します。
ウリ(

49

価値があることについて、速度の3つの提案を比較するテストを実行しました。ランダムな整数を生成し、それらを文字列に変換して、配列に追加しました。次に、可能な最大の数値/文字列を検索しましたasList().contains()。これは、の最悪のシナリオです。

10Kの配列サイズを使用すると、結果は次のようになります。

並べ替えと検索:15
バイナリ検索:0
asList.contains:0

100K配列を使用すると、結果は次のようになります。

並べ替えと検索:156
バイナリ検索:0
asList.contains:32

したがって、配列がソートされた順序で作成されている場合、バイナリ検索が最も高速asList().containsです。多くの検索がある場合、バイナリ検索を使用できるように配列をソートすることは価値があるかもしれません。それはすべてあなたのアプリケーションに依存します。

それらはほとんどの人が期待する結果だと思います。ここにテストコードがあります:

import java.util.*;

public class Test
{
    public static void main(String args[])
    {
        long start = 0;
        int size = 100000;
        String[] strings = new String[size];
        Random random = new Random();


        for (int i = 0; i < size; i++)
            strings[i] = "" + random.nextInt( size );

        start = System.currentTimeMillis();
        Arrays.sort(strings);
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Sort & Search : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Search        : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.asList(strings).contains( "" + (size - 1) ));
        System.out.println("Contains      : " + (System.currentTimeMillis() - start));
    }
}

6
このコードを理解できません。配列 'strings'をソートし、binarySearchの両方の呼び出しで同じ(ソートされた)配列を使用します。HotSpotランタイムの最適化以外の何かをどのように表示できますか?asList.contains呼び出しでも同じです。ソートされた配列からリストを作成し、その上に最も高い値を含むものが含まれています。もちろん時間がかかります。このテストの意味は何ですか?不適切に記述されたマイクロベンチマークであることは言うまでもありません
Erik

また、バイナリ検索はソートされたセットにのみ適用できるため、バイナリ検索を使用する唯一の方法はソートと検索です。
エリック

ソートは他の多くの理由で既に行われている可能性があります。たとえば、ソートはinitでソートされ、変更されない可能性があります。単独で検索時間をテストするのに役立ちます。しかし、これが落ちるのは、マイクロベンチマークの優れた例ではありません。マイクロベンチマークは、Javaで正しく実行するのが難しいことで有名であり、たとえば、実際のテストを実行する前に、ホットスポットを最適化するのに十分なテストコードの実行を含める必要があります。例の落とし穴
Thor84no

7
同じ JVMインスタンスで3つのテストすべてを実行するため、このテストには問題があります。後のテストは、キャッシュ、JITなどをウォームアップする前のテストの恩恵を受ける可能性があります
Steve Kuo

4
このテストは実際にはまったく無関係です。並べ替えと検索は線形(n * log(n))の複雑さ、バイナリ検索は対数、ArrayUtils.containsは明らかに線形です。これらのソリューションはまったく異なる複雑さのクラスにあるため、このソリューションを比較しても意味がありません。
2014

37

クイック配列初期化構文も使用する代わりに、Arrays.asListメソッドを使用して、同様の方法ですぐにリストとして初期化できます。たとえば、次のようにします。

public static final List<String> STRINGS = Arrays.asList("firstString", "secondString" ...., "lastString");

次に、(上記のように)行うことができます:

STRINGS.contains("the string you want to find");

35

Java 8では、ストリームを作成し、ストリーム内のエントリが一致するかどうかを確認できます"s"

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

またはジェネリックメソッドとして:

public static <T> boolean arrayContains(T[] array, T value) {
    return Arrays.stream(array).anyMatch(value::equals);
}

3
原始的な特殊化にも注意する価値があります。
skiwi 2014

さらに、anyMatchJavaDocはそれを追加している"...May not evaluate the predicate on all elements if not necessary for determining the result."ので、一致を見つけた後に処理を続行する必要がない場合もあります。
mkobit 14

28

Arraysクラスを使用して、値のバイナリ検索を実行できます。配列が並べ替えられていない場合は、同じクラスの並べ替え関数を使用して配列を並べ替え、検索する必要があります。


同じクラスのソート関数を使用してそれを行うことができます...それを私の答えに追加する必要があります。
トーマスオーウェンス

1
おそらく、asList()。contains()アプローチよりもコストがかかるでしょう。これを頻繁に行う必要がない限り(ただし、公平に並べ替えることができる静的な値のリストの場合のみ)。
ジョーイ

本当です。どれが最も効果的であるかについては多くの変数があります。オプションがあるのは良いことです。
トーマスオーウェンス

ここでこれを行うコード:stackoverflow.com/a/48242328/9131078
OOBalance

検索の目的で配列全体をソートすると、コストがかかります。ライナー検索自体に同じCPU時間を使用できます。私は、事前にソートされた順序で既に構築されているコレクションのバイナリ検索を好みます。
arunwithasmile 2018

17

ObStupidAnswer(ただし、ここのどこかに教訓があると思います):

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}

1
例外のスローは明らかに重いですが、これが機能する場合、値をテストする新しい方法になります。欠点は、列挙型を事前に定義する必要があることです。
James P.

13

実際、Tom Hawtinが提案したようにHashSet <String>を使用する場合、並べ替えを心配する必要はありません。速度は、事前に並べ替えられた配列でのバイナリ検索と同じで、おそらくさらに高速です。

すべては、コードのセットアップ方法に依存しますが、私が立っているところから見ると、順序は次のようになります。

上の未ソート配列:

  1. ハッシュセット
  2. asList
  3. 並べ替えとバイナリ

ソートされた配列:

  1. ハッシュセット
  2. バイナリ
  3. asList

どちらにしても、勝利のためのHashSet。


2
HashSetメンバーシップはO(1)でなければならず、ソートされたコレクションのバイナリ検索はO(log n)です。
Skylar Saveland 2014

11

Googleコレクションライブラリがある場合、ImmutableSet(http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)を使用すると、トムの答えを大幅に簡略化できます。

これにより、提案された初期化から多くの混乱が取り除かれます

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

10

考えられる解決策の1つ:

import java.util.Arrays;
import java.util.List;

public class ArrayContainsElement {
  public static final List<String> VALUES = Arrays.asList("AB", "BC", "CD", "AE");

  public static void main(String args[]) {

      if (VALUES.contains("AB")) {
          System.out.println("Contains");
      } else {
          System.out.println("Not contains");
      }
  }
}

8

開発者はしばしば次のことを行います:

Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

上記のコードは機能しますが、リストを最初に設定するために変換する必要はありません。リストをセットに変換するには、追加の時間が必要です。次のように簡単にできます。

Arrays.asList(arr).contains(targetValue);

または

   for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }

return false;

最初のものは2番目のものより読みやすいです。


7

これを行うには、単純なループを使用するのが最も効率的です。

boolean useLoop(String[] arr, String targetValue) {
    for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }
    return false;
}

Programcreekへの礼儀


ターゲット値の前にnull参照が配列に含まれている場合、これはnullポインター例外をスローします。
Samuel Edwin Ward、

1
ifステートメントは次のようになります。
TheArchon

nullセーフにするには、代わりにObjects.equals(obj1、obj2)を使用します。
三部作

7

Java 8つの使用ストリーム。

List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);

7
このアプローチには利点がありますか?
Johannes Stadler 2015年

1
質問には答えません。
フロリアンF

5
  1. 限られた長さの配列の場合は、以下を使用します(camickrで指定)。これは、特に長い配列(線形検索)の場合、繰り返しチェックを行うと遅くなります。

     Arrays.asList(...).contains(...)
  2. 要素のより大きなセットを繰り返しチェックする場合、高速パフォーマンスのため

    • 配列は間違った構造です。a TreeSetを使用して、それに各要素を追加します。要素をソートし、高速なexist()方法(バイナリ検索)を備えています。

    • 要素が実装されComparableTreeSetそれに応じてソートする場合:

      ElementClass.compareTo()メソッドは以下と互換性がある必要がありますElementClass.equals()トライアドが戦うために表示されないを参照してください (Java Setにアイテムがありません)

      TreeSet myElements = new TreeSet();
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
      
      // *Alternatively*, if an array is forceably provided from other code:
      myElements.addAll(Arrays.asList(myArray));
    • それ以外の場合は、独自のものを使用しますComparator

      class MyComparator implements Comparator<ElementClass> {
           int compareTo(ElementClass element1; ElementClass element2) {
                // Your comparison of elements
                // Should be consistent with object equality
           }
      
           boolean equals(Object otherComparator) {
                // Your equality of comparators
           }
      }
      
      
      // construct TreeSet with the comparator
      TreeSet myElements = new TreeSet(new MyComparator());
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
    • 見返り:いくつかの要素の存在を確認します。

      // Fast binary search through sorted elements (performance ~ log(size)):
      boolean containsElement = myElements.exists(someElement);

4
なぜ気になるのTreeSetHashSetより高速(O(1))であり、順序付けは必要ありません。
Sean Owen

4

これを試して:

ArrayList<Integer> arrlist = new ArrayList<Integer>(8);

// use add() method to add elements in the list
arrlist.add(20);
arrlist.add(25);
arrlist.add(10);
arrlist.add(15);

boolean retval = arrlist.contains(10);
if (retval == true) {
    System.out.println("10 is contained in the list");
}
else {
    System.out.println("10 is not contained in the list");
}

4

以下を使用します(contains()メソッドはArrayUtils.in()このコードにあります)。

ObjectUtils.java

public class ObjectUtils{

    /**
     * A null safe method to detect if two objects are equal.
     * @param object1
     * @param object2
     * @return true if either both objects are null, or equal, else returns false.
     */
    public static boolean equals(Object object1, Object object2){
        return object1==null ? object2==null : object1.equals(object2);
    }

}

ArrayUtils.java

public class ArrayUtils{

    /**
     * Find the index of of an object is in given array, starting from given inclusive index.
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @param start  The index from where the search must start.
     * @return Index of the given object in the array if it is there, else -1.
     */
    public static <T> int indexOf(final T[] ts, final T t, int start){
        for(int i = start; i < ts.length; ++i)
            if(ObjectUtils.equals(ts[i], t))
                return i;
        return -1;
    }

    /**
     * Find the index of of an object is in given array, starting from 0;
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @return  indexOf(ts, t, 0)
     */
    public static <T> int indexOf(final T[] ts, final T t){
        return indexOf(ts, t, 0);
    }

    /**
     * Detect if the given object is in the given array.
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @return  If indexOf(ts, t) is greater than -1.
     */
    public static <T> boolean in(final T[] ts, final T t){
        return indexOf(ts, t) > -1 ;
    }

}

上記のコードからわかるように、他にもユーティリティメソッドがObjectUtils.equals()ありArrayUtils.indexOf()、他の場所でも使用されています。


私はこのディスカッションに参加するのが非常に遅いですが、この問題を解決する私のアプローチは、数年前に直面したとき、ここに既に投稿されている他の回答とは少し異なっていたので、そのときに使用した解決策を投稿しています、ここでは、誰かがそれが便利だと思った場合に備えて。
Abhishek Oza

3

これをチェックして

String[] VALUES = new String[] {"AB","BC","CD","AE"};
String s;

for(int i=0; i< VALUES.length ; i++)
{
    if ( VALUES[i].equals(s) )
    { 
        // do your stuff
    } 
    else{    
        //do your stuff
    }
}

1
これは機能しません- 一致しないすべての項目のelsefor を入力します(その配列で「AB」を探している場合、3つの値が「AB」ではないため、3回そこに移動します")。
Bernhard Barker

3

Arrays.asList()->次にcontains()メソッドを呼び出すと常に機能しますが、配列の周りに軽量のリストラッパーを作成する必要がないため、検索アルゴリズムの方がはるかに優れています。これはArrays.asList()が行うことです。 。

public boolean findString(String[] strings, String desired){
   for (String str : strings){
       if (desired.equals(str)) {
           return true;
       }
   }
   return false; //if we get here… there is no desired String, return false.
}

Arrays.asListO(n)ではありません。それは単なる軽量ラッパーです。実装を見てください。
Patrick Parker

3

大文字と小文字を区別したくない場合

Arrays.stream(VALUES).anyMatch(s::equalsIgnoreCase);

2

使用する Array.BinarySearch(array,obj)配列内の特定のオブジェクトを見つけるためにします。

例:

if (Array.BinarySearch(str, i) > -1)`  true --exists

false-存在しません


4
Array.BinarySearchおよびArray.FindIndex.NETメソッドであり、Javaには存在しません。
テイラー

@ataylor JavaにはArrays.binarySearchがあります。しかし、あなたは正しい、Arrays.findIndexはありません
メンテ

注意する必要があります:The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
ドリアングレイ

1

最初はfalseに設定されたブール値を作成します。ループを実行して配列のすべての値をチェックし、チェック対象の値と比較します。一致する場合は、booleanをtrueに設定してループを停止します。次に、ブール値が真であることを表明します。


1

Java 8述語テストメソッドを使用してみてください

以下はその完全な例です。

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Test {
 public static final List<String> VALUES = Arrays.asList("AA", "AB", "BC", "CD", "AE");

 public static void main(String args[]) {
  Predicate<String> containsLetterA = VALUES -> VALUES.contains("AB");
  for (String i : VALUES) {

   System.out.println(containsLetterA.test(i));
  } 
 }
}

http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html

https://github.com/VipulGulhane1/java8/blob/master/Test.java


0

a 使用すると、不必要なaの生成が防止されます。Spliterator List

boolean found = false;  // class variable

String search = "AB";
Spliterator<String> spl = Arrays.spliterator( VALUES, 0, VALUES.length );
while( (! found) && spl.tryAdvance(o -> found = o.equals( search )) );

found == truesearch配列に含まれている場合


これプリミティブの配列に対して機能します

public static final int[] VALUES = new int[] {1, 2, 3, 4};
boolean found = false;  // class variable

int search = 2;
Spliterator<Integer> spl = Arrays.spliterator( VALUES, 0, VALUES.length );


-2

2つの方法で確認できます

A)配列を文字列に変換し、.containsメソッドで必要な文字列を確認する

 String a=Arrays.toString(VALUES);
    System.out.println(a.contains("AB"));
    System.out.println(a.contains("BC"));
    System.out.println(a.contains("CD"));
    System.out.println(a.contains("AE"));

B)これはより効率的な方法です

 Scanner s=new Scanner(System.in);


   String u=s.next();
   boolean d=true;
    for(int i=0;i<VAL.length;i++)
    {
        if(VAL[i].equals(u)==d)
            System.out.println(VAL[i] +" "+u+VAL[i].equals(u));  

    }

1
文字列変換は非常に非効率的であり、ソリューションは正しくありません。たとえば、contains( "、")はtrueを返します。
Atuos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.