Reputation: 7568
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
Upvotes: 78
Views: 157093
Reputation: 1
java.util.Collections.indexOfSubList(arrayListIS, arrayListIF)
Upvotes: -1
Reputation: 41
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));
Upvotes: 4
Reputation: 17
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... }
Upvotes: -2
Reputation: 91
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));
Upvotes: 9
Reputation: 5853
There is a method called containsAll
declared in the java.util.Collection
interface. In your setting one.containsAll(two)
gives the desired answer.
Upvotes: 137
Reputation: 727137
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.
Upvotes: 5
Reputation: 1246
Take a look at containsAll(Collection<?> c)
method from List
interface. I think it is what you are looking for.
Upvotes: 11
Reputation: 59363
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.
Upvotes: 5