如何获取两个ArrayLists的重复值?

时间:2015-05-29 08:37:07

标签: java arraylist duplicates array-merge

假设我有2个ArrayList of Points:

  1. (0,2)->(0,3)->(0,4)
  2. (0,2)->(0,3)->(0,6)
  3. 我想获得一个新列表:(0,2)->(0,3)

    我该怎么做?

    当前解决方案

    使用两个foreach循环逐个元素地比较两个列表。我认为这是一种非常低效的方式。还有其他方法吗?

2 个答案:

答案 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)