两个列表的交集是使用retainAll() 方法完成的。
它会更新列表,所以如果你不想这样做,你应该先复制列表。
如果您有 2 个以上的列表,则复制第一个,然后为剩余的每个列表调用 retainAll()。
ArrayList<ArrayList<String>> lists = ...
List<String> intersection = new ArrayList<>(lists.get(0));
for (List<String> list : lists.subList(1, lists.size()))
intersection.retainAll(list);
但是性能会很差O(n*m),其中n 和m 是两个最大列表的大小。
这是因为retainAll() 对参数中给出的列表执行contains(),这是对intersection 列表中的每个元素的顺序搜索。
通过将列表转换为集合,性能可以提高到 O(n),其中n 是最大的列表。
List<String> intersection = new ArrayList<>(lists.get(0));
for (List<String> list : lists.subList(1, lists.size()))
intersection.retainAll(new HashSet<>(list));
在 Java 8+ 中,for 循环可以简化为以下之一:
lists.subList(1, lists.size()).stream().map(HashSet::new).forEach(intersection::retainAll);
lists.subList(1, lists.size()).forEach(list -> intersection.retainAll(new HashSet<>(list)));