65

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

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

8 回答 8

114

接口containsAll中声明了一个方法调用。java.util.Collection在您的设置中one.containsAll(two)给出所需的答案。

于 2013-01-24T22:07:29.250 回答
14

根据列表界面:

myList.containsAll(...);
于 2013-01-24T22:07:31.207 回答
11

containsAll(Collection<?> c)List接口看方法。我想这就是你要找的。

于 2013-01-24T22:07:52.480 回答
7

这是另一个使用 containsAll() 的示例,我用它来断言 JUnit 测试中两个数组相等:

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));
于 2016-08-12T15:35:06.713 回答
5

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

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

如果oneN的长度和两个的长度是M,这个解的时间复杂度是O(M+N);"plain"containsAll的复杂度为O(M*N),可能会更糟。

于 2013-01-24T22:09:11.173 回答
4

您在示例中的代码没有意义,但无论如何这里有一个示例。

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

编辑:哦,哇,我完全忘记了containsAll。哦,好吧,如果您真的想了解它,这是另一种方法。

于 2013-01-24T22:07:21.640 回答
4

这也可以使用 Java 中的流来完成

    List<String> employeeList = Arrays.asList("Marc","john");
    List<String> masterEmployeeList = Arrays.asList("Marc", "Stacy", "john");
    System.out.println(employeeList.stream().allMatch(masterEmployeeList::contains));
于 2021-05-14T11:49:28.957 回答
-1

在 org.apache.commons.collections.CollectionUtils 中声明的 isEqualCollection() 方法为您提供集合是否相同。

if (CollectionUtils.isEqualCollection(collectionA,collectionB)) { 做 smt... }

于 2020-08-19T07:02:20.103 回答