おそらく私がここで見つけていない単純なワンライナーがありますが、これは私の質問です:
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
_Java.util.Collection
_インターフェイスで宣言されたcontainsAll
というメソッドがあります。設定でone.containsAll(two)
は希望する答えを与えます。
リストインターフェイスごと:
myList.containsAll(...);
List
インターフェイスのcontainsAll(Collection<?> c)
メソッドを見てください。あなたが探しているものだと思います。
リストのcontainsAll
メソッドを使用してチェックを行うことができます。ただし、これは線形操作です。リストが大きい場合は、最初にHashSet
に変換してからcontainsAll
を実行する必要があります。
_HashSet tmp = new HashSet(one);
if (tmp.containsAll(two)) {
...
}
_
one
の長さがN
で、2つの長さがM
である場合、このソリューションにはO(M+N)
;の時間の複雑さがあります。 「プレーン」containsAll
にはO(M*N)
の複雑さがありますが、これはかなり悪い場合があります。
次に、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));
例のコードは意味をなしませんが、とにかく例はここにあります。
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 。まあ、これはあなたが本当にそれを理解したいなら、それをする別の方法です。