在Java中查找N个列表之间的公共元素

dev*_*dev 1 java arrays collections intersection list

我需要编写一个Java程序来查找任意数量的列表或整数数组(任意长度)的交集(公共元素).我想Java Lists可能有一个有用的方法来实现这一点,但我正在看看API并且找不到它.

任何提示?

And*_*ner 5

您可以通过将一个列表的元素复制到新列表中来查找两个列表之间的公共元素,并使用retainAll:

List<T> commonElements = new ArrayList<>(list1);
commonElements.retainAll(list2);
Run Code Online (Sandbox Code Playgroud)

这可以扩展到n列表,因为n列表中的公共元素是[第一个n-1列表的公共元素]和[ 第一个列表的元素] 的共同元素n:

commonElements.retainAll(list3);
commonElements.retainAll(list4);
...
Run Code Online (Sandbox Code Playgroud)

例如

<T> List<T> commonElements(Iterable<? extends List<? extends T>> lists) {
  Iterator<? extends List<? extends T>> it = lists.iterator();
  List<T> commonElements = new ArrayList<T>(it.next());
  while (it.hasNext()) {
    commonElements.retainAll(it.next());
  }
  return commonElements;
}
Run Code Online (Sandbox Code Playgroud)

请注意,NoSuchElementException如果列表为空,则会失败.通过it.hasNext()在第一个之前添加检查,可以直接处理这种情况it.next().