假设我有2个ArrayList of Points:
(0,2)->(0,3)->(0,4)
(0,2)->(0,3)->(0,6)
我想获得一个新列表:(0,2)->(0,3)
我该怎么做?
当前解决方案
使用两个foreach循环逐个元素地比较两个列表。我认为这是一种非常低效的方式。还有其他方法吗?
答案 0 :(得分:6)
您可以使用List#retainAll(Collection<?> c)
方法,其中:
仅保留此列表中包含在指定集合中的元素(可选操作)。换句话说,从该列表中删除未包含在指定集合中的所有元素。
List<Point> first = ...
List<Point> second = ...
first.retainAll(second);
答案 1 :(得分:0)
如果是大型列表,请将一个列表的元素添加到HashSet
并迭代其他列表,同时继续将元素添加到HashSet
contains
List<Point> list1 = new ArrayList<Point>(Arrays.asList(new Point[]{new Point(0,2), new Point(0,3), new Point(0,4)}));
List<Point> list2 = new ArrayList<Point>(Arrays.asList(new Point[]{new Point(0,2), new Point(0,3), new Point(0,6)}));
Set<Point> setList1 = new HashSet<Point>(list1);
List<Point> intersection = list2.stream().filter( l -> setList1.contains(l)).collect(Collectors.toList());
时间复杂度, 添加到Set = O(n),迭代列表= O(k)时间哈希集查找O(1) 〜总体O(n)