检查一个ArrayList包含了另一个的ArrayList(或集合)的每一个元素(Check if

2019-07-18 16:35发布

有可能是,我只是没有在这里找到一个简单的一行,但这是我的问题:

如何检查是否一个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

Answer 1:

有一个叫方法containsAll在声明java.util.Collection接口。 在您的设置one.containsAll(two)得到所需的答案。



Answer 2:

每List接口:

myList.containsAll(...);


Answer 3:

看一看containsAll(Collection<?> c)的方法从List界面。 我认为这是你在找什么。



Answer 4:

您可以使用containsAll列表的方法做检查。 然而,这是一个线性操作。 如果列表很大,你应该将其转换为HashSet第一,然后执行containsAll

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

如果长度oneN和两种是长度M ,该解决方案具有时间的复杂性O(M+N) ; 的“普通” containsAll具有的复杂性O(M*N)其可以是显著恶化。



Answer 5:

您在示例代码中没有任何意义,但这里有一个例子呢。

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的#包含 。

编辑 :哇哦,我完全忘了containsAll 。 哦,这是一个替代办法做到这一点,如果你真的想了解它。



Answer 6:

下面是另一个例子的使用,我已经用于断言两个数组中的JUnit测试等于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));


文章来源: Check if an ArrayList contains every element from another ArrayList (or Collection)