2015-05-29 55 views
2

比方說,我有2個ArrayList的積分:如何獲取兩個ArrayLists的重複值?

  1. (0,2)->(0,3)->(0,4)
  2. (0,2)->(0,3)->(0,6)

我想獲得一個新的列表:(0,2)->(0,3)

我該怎麼辦呢?

目前的解決方案

使用兩個foreach循環的元素的兩個列表比較,元素。我認爲這是一種非常低效的方式。還有其他方法嗎?

+0

它們是否應該具有相同的順序?中間的點可以跳過嗎? – Bubletan

+0

@Bubletan不一定以相同的順序。跳過點在中間?你的意思是什麼? – Mark

+0

好的,第二個只是另一個問題,以防訂單會影響。 – Bubletan

回答

6

可以使用List#retainAll(Collection<?> c)方法,其中:

只保留此列表中包含在指定collection中(可選操作)中的元素。換句話說,從該列表中刪除所有未包含在指定集合中的元素。

List<Point> first = ... 
List<Point> second = ... 
first.retainAll(second); 
+1

您可能想提一下,JCF中有很多方法與Set theory中的概念相對應。無論如何+1。 –

+0

這比OPs解決方案效率更高:它仍然是O(n^2)。對第二個使用'Set'會使大集合更快。 –

+0

它的一個缺點是它修改了原始列表(因爲OP說新列表) –

0

如果大型列表,添加一個列表的元素爲HashSet和迭代等,同時不斷將元素添加到新的列表,其中HashSetcontains

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()); 

時間複雜度, 添加到設置= O(n),迭代列表= O(k)時間哈希集合查找O(1) 〜總體O(n)