2011-01-31 5 views
9

私はArrayList<int[]>を持っており、それに配列を追加します。整数配列のArrayListにcontainsを使用する

ArrayList<int[]> j = new ArrayList<int[]>(); 
int[] w = {1,2}; 
j.add(w); 

は、私はjは、私は別のクラスからそれを呼び出すことになるので、wを使用せずに、その中に{1,2}を持つ配列が含まれているかどうかを知りたいとします。だから、私は

int[] t = {1,2}; 
return j.contains(t); 

...それで{1,2}で新しい配列を作成します...しかし、これはwがリストに追加されたにもかかわらず、falseを返すだろう、とwtとまったく同じ配列が含まれています。

ArrayListの要素の1つが配列値{1,2}を持っているかどうかを確認することができるように、containsを使用する方法はありますか?

答えて

7

配列はArrays.equals()としか比較できません。

おそらくArrayListのArrayListが必要です。 Java APIから

ArrayList<ArrayList<Integer>> j = new ArrayList<ArrayList<Integer>>(); 
ArrayList<Integer> w = new ArrayList<Integer>(); 
w.add(1); w.add(2); 
j.add(w); 
ArrayList<Integer> t = new ArrayList<Integer>(); 
t.add(1); t.add(2); 
return j.contains(t); // should return true. 
+0

残念なことに実際の問題は解決しません。 'w'が' 1,2,3'を持っていたら? –

+0

私はユーザーが正確な配列を比較したいと思っていましたが、配列のスライスは言及していませんでした。 –

+0

あなたが正しいです、多分私は誤解していました。 –

0

リストを繰り返して、配列が条件を満たすかどうかを手動で確認する必要があります。

public static boolean containsSubArray(List<int[]> j, int[] sub) { 
    for (int[] arr : j) { 
     if (arr contains elements of sub) { 
     return true; 
     } 
    } 
    return false; 
} 

完全一致の場合は、Arrays.equals()を使用できます。私は配列にすべてを含むライブラリ関数があるとは思わないので、もしあなたが望むのであれば、それを書く必要があります。

0

:このリストは 指定された要素が含まれている場合

public boolean contains(Object o) 

はtrueを返します。より公式には、 は、このリスト に少なくともの(o==null ? e==null : o.equals(e))という要素が1つ以上含まれている場合にのみtrueを返します。

int[]がプリミティブなので、私は確かに.equalsメソッドが存在しないので、私はいつもfalseを返すだろうと考えています。

私はデータを格納する別の方法をお勧めしますか?多分何らかの種類の鍵で?

+0

'int []'は実際にプリミティブではありません。すべての配列は 'Object'であり、オペランドが同じ*インスタンス*(' == ') –

+0

int []がプリミティブでない場合に真を返す' equals() 'の実装を継承します。 intはです。 int []はObjectを拡張しますが、 'equals() 'をオーバーライドしません。 –

+0

ah my b。私はequals()メソッドをオーバーライドしないので、containsには使用できません。 – eosgood

6

ここでの問題は、配列がObject.equals(Object)をオーバーライドしていないということなので、2つのリストのエントリとの比較は、デフォルトのequals()の実装

// from Object.class 
public boolean equals(Object obj) { 
return (this == obj); 
} 

で発生ですから、リストを反復処理し、すべてのエントリをチェックする必要がArrays.equals(int[], int[])を使用してください。

public static boolean isInList(
    final List<int[]> list, final int[] candidate){ 

    for(final int[] item : list){ 
     if(Arrays.equals(item, candidate)){ 
      return true; 
     } 
    } 
    return false; 
} 

アップデート:ここでこれを行うヘルパーメソッドがありますこれまでのJava 8以降、これはずっと簡単持っている:

public static boolean isInList(
     final List<int[]> list, final int[] candidate) { 

    return list.stream().anyMatch(a -> Arrays.equals(a, candidate)); 
      // ^-- or you may want to use .parallelStream() here instead 
} 
0

平等のための契約の確認 "を含みます"。だからあなたの場合、何が失敗しているのかはint []の平等です。 ArrayObjectからequalsメソッドをオーバーライドしないため、包含をチェックするための回避策が必要です。

Arrayの封じ込めを確認する必要がある場合は、ArrayListを繰り返し処理して比較を行います。

0

2つのJava配列配列は、同じオブジェクト参照を持つ場合、等しいです。内容は重要ではありません。

コンテンツが等しいかどうかを確認する方法を探しています。これにより、次のことが可能になります。

Arrays.equals(new int[]{1,2}, new int[]{1,2}); // evaluates to true 
Arrays.equals(new int[]{1,2}, new int[]{2,1}); // evaluates to false (!) 

注文が等価に影響しないようにするには、静的等価メソッドを自分で実装する必要があります。

0

最初は同じオブジェクト参照ではないため、同じではありません。 equals()はfalseを返します。 条件に合わせて、自分で比較する方法を実装する必要があります。

関連する問題