Java 如何获取两个ArrayList的重复值?
假设我有两个点的数组列表:Java 如何获取两个ArrayList的重复值?,java,arraylist,duplicates,array-merge,Java,Arraylist,Duplicates,Array Merge,假设我有两个点的数组列表: (0,2)->(0,3)->(0,4) (0,2)->(0,3)->(0,6) 我想获得一个新列表:(0,2)->(0,3) 我该怎么做 当前解决方案 使用两个foreach循环逐元素比较这两个列表。我认为这是一种非常低效的方法。还有其他方法吗?您可以使用以下方法: 仅保留此列表中包含在指定集合中的元素(可选操作)。换句话说,从该列表中删除指定集合中不包含的所有元素 List first=。。。 第二个列表=。。。 第一,保留(第二); 如果列表较大,则将一个列表的元
(0,2)->(0,3)->(0,4)
(0,2)->(0,3)->(0,6)
(0,2)->(0,3)
我该怎么做
当前解决方案
使用两个foreach循环逐元素比较这两个列表。我认为这是一种非常低效的方法。还有其他方法吗?您可以使用以下方法:
仅保留此列表中包含在指定集合中的元素(可选操作)。换句话说,从该列表中删除指定集合中不包含的所有元素
List first=。。。
第二个列表=。。。
第一,保留(第二);
如果列表较大,则将一个列表的元素添加到哈希集
中,并迭代其他元素,同时继续将元素添加到哈希集
包含的新列表中
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());
list1=newarraylist(Arrays.asList(new Point[]{new Point(0,2)、new Point(0,3)、new Point(0,4)});
List list2=新的ArrayList(Arrays.asList(新点[]{新点(0,2),新点(0,3),新点(0,6)});
Set setList1=新哈希集(list1);
List intersection=list2.stream().filter(l->setList1.contains(l)).collect(Collectors.toList());
时间复杂性,
添加到Set=O(n),迭代list=O(k)时间哈希集查找O(1)
~O(n)他们应该有相同的顺序吗?中间是否有跳跃的点?跳过中间点?你这是什么意思?好吧,第二个问题只是另一个问题,如果顺序很重要的话。你可能想提到,JCF中有很多方法对应于集合论中的概念。无论如何+1。这并不比OPs解决方案更有效:它仍然是O(n^2)。使用
Set
进行second
将使大型收藏更快。一个缺点是它会修改原始列表(因为OP表示新列表)
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());