Check if an ArrayList contains every element from another ArrayList (or Collection)

JavaArraylistComparisonContains

Java Problem Overview


There is probably a simple one-liner that I am just not finding here, but this is my question:

How do I check if an ArrayList contains all of the objects in another ArrayList? I am looking (if it exists) for something along the lines of:

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

For example:

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 Solutions


Solution 1 - Java

There is a method called containsAll declared in the java.util.Collection interface. In your setting one.containsAll(two) gives the desired answer.

Solution 2 - Java

Per the List interface:

myList.containsAll(...);

Solution 3 - Java

Take a look at containsAll(Collection<?> c) method from List interface. I think it is what you are looking for.

Solution 4 - Java

Here is another example use of containsAll() that I have used for asserting that two arrays are equal in JUnit testing:

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));

Solution 5 - Java

You can use containsAll method of the list to do the check. However, this is a linear operation. If the list is large, you should convert it to HashSet first, and then perform containsAll:

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

If the length of one is N and the length of two is M, this solution has time complexity of O(M+N); the "plain" containsAll has the complexity of O(M*N), which may be significantly worse.

Solution 6 - Java

Your code in the example doesn't make sense, but here's an example anyway.

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;
    }
}

It simply loops through all of two's elements and checks to see if they are in one.

Then the boolean good contains the value you want.

See ArrayList#contains.

EDIT: oh wow, I totally forgot containsAll. Oh well, this is an alternate way to do it if you really want to understand it.

Solution 7 - Java

This can also be done using streams in Java

    List<String> employeeList = Arrays.asList("Marc","john");
	List<String> masterEmployeeList = Arrays.asList("Marc", "Stacy", "john");
	System.out.println(employeeList.stream().allMatch(masterEmployeeList::contains));

Solution 8 - Java

isEqualCollection() method declared in the org.apache.commons.collections.CollectionUtils gives you the collections are same or not.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEvorlorView Question on Stackoverflow
Solution 1 - JavaC-OttoView Answer on Stackoverflow
Solution 2 - JavasplungebobView Answer on Stackoverflow
Solution 3 - JavaDamian JeżewskiView Answer on Stackoverflow
Solution 4 - JavaJimiMacView Answer on Stackoverflow
Solution 5 - JavaSergey KalinichenkoView Answer on Stackoverflow
Solution 6 - JavatckmnView Answer on Stackoverflow
Solution 7 - JavaPiyush AggarwalView Answer on Stackoverflow
Solution 8 - JavaYucesView Answer on Stackoverflow