web-dev-qa-db-ja.com

ArrayListに別のArrayList(またはコレクション)のすべての要素が含まれているかどうかを確認します

おそらく私がここで見つけていない単純なワンライナーがありますが、これは私の質問です:

ArrayListに別のArrayListのすべてのオブジェクトが含まれているかどうかを確認するにはどうすればよいですか?私は(存在する場合)の線に沿って何かを探しています:

//INCORRECT EXAMPLE:
if(one.contains(two))
{
    return true;
}
else
{
    return false;
}

例えば:

ArrayList one = {1, 2, 3, 4, 5}

ArrayList two = {1, 2, 3} --> True
ArrayList two = {} --> True
ArrayList two = {1, 2, 3, 4, 5} --> True
ArrayList two = {1, 5, 2} --> True
ArrayList two = {1, 7, 4} --> False
ArrayList two = {0, 1, 3} --> False
ArrayList two = {4, 5, 6} --> False
ArrayList two = {7, 8, 9} --> False
44
Evorlor

_Java.util.Collection_インターフェイスで宣言されたcontainsAllというメソッドがあります。設定でone.containsAll(two)は希望する答えを与えます。

78
C-Otto

リストインターフェイスごと:

myList.containsAll(...);
11
splungebob

ListインターフェイスのcontainsAll(Collection<?> c)メソッドを見てください。あなたが探しているものだと思います。

10

リストのcontainsAllメソッドを使用してチェックを行うことができます。ただし、これは線形操作です。リストが大きい場合は、最初にHashSetに変換してからcontainsAllを実行する必要があります。

_HashSet tmp = new HashSet(one);
if (tmp.containsAll(two)) {
    ...
}
_

oneの長さがNで、2つの長さがMである場合、このソリューションにはO(M+N);の時間の複雑さがあります。 「プレーン」containsAllにはO(M*N)の複雑さがありますが、これはかなり悪い場合があります。

5
dasblinkenlight

次に、JUnitテストで2つの配列が等しいことをアサートするために使用したcontainsAll()の別の使用例を示します。

List<String> expected = new ArrayList<String>();
expected.add("this");
expected.add("that");
expected.add("another");

List<String> actual = new ArrayListString();
actual.add("another");
actual.add("that");
actual.add("this");

Assert.assertTrue("The lists do not match!", expected.containsAll(actual));
5
JimiMac

例のコードは意味をなしませんが、とにかく例はここにあります。

ArrayList<Integer> one, two;
//initialize
boolean good = true;
for (int i = 0; i < two.size(); i ++) {
    if (!(one.contains(two.get(i))) {
        good = false;
        break;
    }
}

単にtwoのすべての要素をループし、それらがoneにあるかどうかを確認します。

次に、ブール値goodに必要な値が含まれます。

ArrayList#contains を参照してください。

[〜#〜] edit [〜#〜]:わあ、すっかり忘れていました containsAll 。まあ、これはあなたが本当にそれを理解したいなら、それをする別の方法です。

3
Doorknob