Java、int配列にintが含まれているかどうかの簡易チェック


94

基本的に私の仲間は、int配列にintが含まれているかどうかをチェックする別の方法を使用してコードを短くできると言っていましたが、彼はそれが何であるかを教えません:P。

電流:

public boolean contains(final int[] array, final int key) {
    for (final int i : array) {
        if (i == key) {
            return true;
        }
    }
    return false;
}

これも試しましたが、何らかの理由で常にfalseを返します。

public boolean contains(final int[] array, final int key) {
    return Arrays.asList(array).contains(key);
}

誰か助けてもらえますか?

ありがとうございました。


8
Arrays.asList(...)呼び出しはvarargを受け取ります。つまり、渡した引数の任意の数をリストにラップします。あなたの場合、単一の要素を持つ配列のリストを取得していますが、このリストには明らかにintが含まれていません。
sarcan

あなたのコメントは今何を意味していますか?
sarcan

チェックにHashset基づく再試行メカニズムの回答。それが最速の方法です。
アミットデシュパンデ

引数はプリミティブ配列であり、コードは非常に明確でまっすぐなので、元のコードを短くしても意味がありません。ArrayList実装も同じです。
Genzer 2012

私はあなたのコードを短くしません。(1)arraylistはあなたがしたのと同じことをします。(2)-より重要なことは、Arrays.asListを使用する短いコードが新しいオブジェクトを作成することです。これは、パフォーマンスが重要なコード内で問題になる可能性があります。最初のコードスニペットは、実行できる最善の方法です。
Martin Podval、2015年

回答:


38

ここにJava 8ソリューションがあります

public static boolean contains(final int[] arr, final int key) {
    return Arrays.stream(arr).anyMatch(i -> i == key);
}

63

あなたは単にArrayUtils.containsから使用することができますApache Commons Lang library

public boolean contains(final int[] array, final int key) {     
    return ArrayUtils.contains(array, key);
}

1
ArrayUtilsを使用している限り、ArrayUtils.contains
mjohnsonengr

2
理由は
まったく

20
これArrayUtils.contains()Apache Commons Langライブラリの一部であることは注目に値します。これは素晴らしい
ライブラリ

1
ArrayUtilsは過去のものです。Java 8+とGuavaにはかなり素晴らしい機能があります!!
TriCore、2017年

34

Arrays.asList(array)リターンだからList<int[]>です。array引数は、varargではなく、ラップする1つの値(intの配列のリストを取得)として扱われます。

(プリミティブではなく)オブジェクトタイプで機能することに注意してください。

public boolean contains(final String[] array, final String key) {
    return Arrays.asList(array).contains(key);
}

あるいは:

public <T>  boolean contains(final T[] array, final T key) {
    return Arrays.asList(array).contains(key);
}

ただし、List<int>ここではオートボクシングを使用できません。


1
オートボクシングが機能しないのはなぜですか、それが最終として宣言されているためですか?
subhashis

19

Guavaはプリミティブ型の追加メソッドを提供します。その中に、あなたと同じ引数を取るcontainsメソッドがあります。

public boolean contains(final int[] array, final int key) {
    return Ints.contains(array, key);
}

静的にguavaバージョンをインポートすることもできます。

説明されているグアバプリミティブを参照


18

別の方法:

public boolean contains(final int[] array, final int key) {  
     Arrays.sort(array);  
     return Arrays.binarySearch(array, key) >= 0;  
}  

これにより、渡された配列が変更されます。配列をコピーして元の配列で作業するオプションがあります。int[] sorted = array.clone();
ただし、これは短いコードの例にすぎません。ランタイムはO(NlogN)途中ですO(N)


30
containsメソッドが私の配列を変更した場合、私は驚くと思います。
ゾン

@ZongLi:我々はつべこべしている場合、これはOP.Updated OPのための単なる一例である
クラテュロス

5
binarySearch()のjavadocから:「キーが見つかった場合にのみ、戻り値は0以上になります。」したがって、Arrays.binarySearch(array、key)> = 0が返されます。
icza 14

補足:-1以外の値である可能性のあるキーが含まれていない場合、binarySearch()の戻り値は(-(挿入ポイント)-1)です。
icza 2014

-1それが本当であるつもりである場合、これはあり得ません。「挿入ポイントは、キーがリストに挿入されるポイントとして定義されます。キーより大きい最初のエレメントのインデックス、またはリスト内のすべてのエレメントが指定されたキーより小さい場合はlist.size()。 」言う必要があります>= 0
ブライアン


1

1.一回限りの使用

List<T> list=Arrays.asList(...)
list.contains(...)

2.複数回使用する場合は、パフォーマンスを考慮してHashSetを使用します。

Set <T>set =new HashSet<T>(Arrays.asList(...));
set.contains(...)

1

これを試して:

public static void arrayContains(){
    int myArray[]={2,2,5,4,8};

    int length=myArray.length;

    int toFind = 5;
    boolean found = false;

    for(int i = 0; i < length; i++) {
        if(myArray[i]==toFind) {
            found=true;
        }
    }

    System.out.println(myArray.length);
    System.out.println(found); 
}

1

以下のJava 8コードを使用して、プリミティブなint配列をIntegerのarraylistに変換できます。

List<Integer> arrayElementsList = Arrays.stream(yourArray).boxed().collect(Collectors.toList());

次に、contains()メソッドを使用して、リストに特定の要素が含まれているかどうかを確認します。

boolean containsElement = arrayElementsList.contains(key);

0

これはJava 8で機能しました

public static boolean contains(final int[] array, final int key)
{
return Arrays.stream(array).anyMatch(n->n==key);
}

最初の一致ですぐに戻るはずですが、一致が見つかった場合でも、配列内のすべてのアイテムをスキャンします。(トリリオンアイテムの配列を検討してください)
TriCore

あなたは正しいこの静的なブール値を含むトライを含むcontains(final int [] array、final int key){return Arrays.stream(array).anyMatch(n-> n == key); }
Farhad Baghirov

Java 8のストリームanyMatchは短絡操作であり、配列内のすべての項目をスキャンしません。
LordParsley

@LordParsley上記のコードの目的は、配列のすべての要素をスキャンするのではなく、配列の要素をチェックすることです。
Farhad Baghirov

回答が編集されたようです。途中で見つかった場合、すべてをスキャンする必要がないので、私はそれが正しいことを繰り返し述べました。
LordParsley

0

java.util.Arraysクラスを使用T[?]して、次のList<T>ようなメソッドでオブジェクトの配列を変換できますcontains

Arrays.asList(int[] array).contains(int key);

-1

intの配列の大きさに応じて、コレクションを使用する場合.contains、一度に1つの要素を配列で反復するよりも、はるかに優れたパフォーマンスが得られます。

import static org.junit.Assert.assertTrue;
import java.util.HashSet;

import org.junit.Before;
import org.junit.Test;

public class IntLookupTest {

int numberOfInts = 500000;
int toFind = 200000;
int[] array;

HashSet<Integer> intSet;

@Before
public void initializeArrayAndSet() {
    array = new int[numberOfInts];
    intSet = new HashSet<Integer>();
    for(int i = 0; i < numberOfInts; i++) {
        array[i] = i;
        intSet.add(i);
    }
}

@Test
public void lookupUsingCollections() {
    assertTrue(intSet.contains(toFind));
}

@Test
public void iterateArray() {
    assertTrue(contains(array, toFind));

}

public boolean contains(final int[] array, final int key) {
    for (final int i : array) {
        if (i == key) {
            return true;
        }
    }
    return false;
}
}

-1

ソリューション#1

元の質問は単純化されたソリューションのみを望んでいるので(より高速なものは必要ありません)、これが1行のソリューションです。

public boolean contains(int[] array, int key) {
    return Arrays.toString(array).matches(".*[\\[ ]" + key + "[\\],].*");
}

説明: JavadocのArrays.toString()状態の結果は角括弧で囲まれ、隣接する要素は文字「、」(コンマの後にスペースが続く)で区切られます。これを当てにできます。最初にarray文字列に変換し、次にkeyこの文字列に含まれているかどうかを確認します。もちろん、「サブ番号」(たとえば、「1234」には「23」が含まれる)を受け入れることはできません。そのため、のkey前に開き括弧またはスペースがあり、その後に閉じ括弧またはコンマが続くパターンを探す必要があります。

注:使用される正規表現パターンも負の数を適切に処理します(その文字列表現はマイナス記号で始まります)。

ソリューション#2

この解決策は既に投稿されていますが、間違いが含まれているため、正しい解決策を投稿します。

public boolean contains(int[] array, int key) {
    Arrays.sort(array);
    return Arrays.binarySearch(array, key) >= 0;
}

また、このソリューションには副作用があります:を変更array(ソート)します。


文字列のhandligは一般に高価ですが、誰かがintを文字列として扱う必要があるのはなぜですか?
Denys Vitali 2016年

@DenysVitali opにはすでに有効で効率的なソリューションがあり、より短いソリューションを探しているためです。そして、これらは短いです。この質問はパフォーマンスに関するものではありません。
icza

私はその時、質問を誤解していたはずです
Denys Vitali

-5

Integer.parseInt()これをやってみて.....

public boolean chkInt(final int[] array){
    int key = false;

    for (Integer i : array){


          try{

                   Integer.parseInt(i);
                   key = true;
                   return key;

             }catch(NumberFormatException ex){

                   key = false;

                   return key;

              }


     }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.