比方說,我有2個ArrayList的積分:如何獲取兩個ArrayLists的重複值?
(0,2)->(0,3)->(0,4)
(0,2)->(0,3)->(0,6)
我想獲得一個新的列表:(0,2)->(0,3)
我該怎麼辦呢?
目前的解決方案
使用兩個foreach循環的元素的兩個列表比較,元素。我認爲這是一種非常低效的方式。還有其他方法嗎?
比方說,我有2個ArrayList的積分:如何獲取兩個ArrayLists的重複值?
(0,2)->(0,3)->(0,4)
(0,2)->(0,3)->(0,6)
我想獲得一個新的列表:(0,2)->(0,3)
我該怎麼辦呢?
目前的解決方案
使用兩個foreach循環的元素的兩個列表比較,元素。我認爲這是一種非常低效的方式。還有其他方法嗎?
可以使用List#retainAll(Collection<?> c)
方法,其中:
只保留此列表中包含在指定collection中(可選操作)中的元素。換句話說,從該列表中刪除所有未包含在指定集合中的元素。
List<Point> first = ...
List<Point> second = ...
first.retainAll(second);
您可能想提一下,JCF中有很多方法與Set theory中的概念相對應。無論如何+1。 –
這比OPs解決方案效率更高:它仍然是O(n^2)。對第二個使用'Set'會使大集合更快。 –
它的一個缺點是它修改了原始列表(因爲OP說新列表) –
如果大型列表,添加一個列表的元素爲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());
時間複雜度, 添加到設置= O(n),迭代列表= O(k)時間哈希集合查找O(1) 〜總體O(n)
它們是否應該具有相同的順序?中間的點可以跳過嗎? – Bubletan
@Bubletan不一定以相同的順序。跳過點在中間?你的意思是什麼? – Mark
好的,第二個只是另一個問題,以防訂單會影響。 – Bubletan