I need to write a Java program that finds the intersection (common elements) of an arbitrary number of lists or arrays of integers (of arbitrary length). I guess that Java Lists may have a useful method in order to achieve this, but I am taking a look at the API and can´t find it.
Any hint?
解决方案
You can find the common elements between two lists by copying the elements of one list into a new list, and using retainAll:
List commonElements = new ArrayList<>(list1);
commonElements.retainAll(list2);
This can be extended to n lists, since the common elements in n lists are the common elements of [the common elements of the first n-1 lists] and the [elements of the n-th list]:
commonElements.retainAll(list3);
commonElements.retainAll(list4);
...
e.g.
List commonElements(Iterable extends List extends T>> lists) {
Iterator extends List extends T>> it = lists.iterator();
List commonElements = new ArrayList(it.next());
while (it.hasNext()) {
commonElements.retainAll(it.next());
}
return commonElements;
}
Note that this will fail with a NoSuchElementException if lists is empty. It is straightforward to handle for this case, by adding a check for it.hasNext() before the first it.next().