java - 使用 Set 从 arrayList 中删除重复列表
问题描述
我有一个包含重复 ArrayList 的列表。
我正在寻找删除它们的解决方案。
这是一个例子:
listOne = [[1, 0], [0, 1], [3, 2], [2, 3]]
该集合包含重复的列表。通常我想得到:
theListAfterTransformation = [[1, 0],[3, 2]]
这是我的小例子,我尝试使用 Set 但效果不佳。
public class Example {
public static void main( String[] args ) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
ArrayList<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(0);
ArrayList<Integer> list2 = new ArrayList<>(); list2.add(0); list2.add(1);
ArrayList<Integer> list3 = new ArrayList<>(); list3.add(3); list3.add(2);
ArrayList<Integer> list4 = new ArrayList<>(); list4.add(2); list4.add(3);
lists.add(list1);lists.add(list2);lists.add(list3);lists.add(list4);
System.out.println(getUnduplicateList(lists));
}
public static ArrayList<ArrayList<Integer>> getUnduplicateList( ArrayList<ArrayList<Integer>> lists) {
Iterator iterator = lists.iterator();
Set<ArrayList<Integer>> set = new HashSet<>();
while (iterator.hasNext()){
ArrayList<Integer> list = (ArrayList<Integer>) iterator.next();
set.add(list);
}
return new ArrayList<>(set);
}
}
请注意,这是我项目中的一个小例子,在这个实现中很难使用一个改变很多东西的解决方案。
所以要考虑到 getUnduplicateList 应该保持相同的签名。好主意是只改变实施。
该程序打印与输入相同的列表。请有任何想法。
解决方案
关于术语的几点说明——<a href="https://docs.oracle.com/javase/7/docs/api/java/util/Set.html" rel="nofollow noreferrer">Set
是一种不同的数据结构List
,其中前者是无序的并且不允许重复,而后者是基本的线性集合,通常是有序的,并且允许重复。您似乎可以互换使用这些术语,这可能是您遇到的问题的一部分:Set
可能是这里的适当数据结构。
也就是说,您的代码似乎依赖于List
API,因此我们可以继续跟进。请注意,一般情况下,您应该对接口( List
) 进行编码,而不是对特定类 ( ArrayList
) 进行编码。
此外,考虑使用Arrays.asList
速记方法来初始化列表(请注意,这将返回一个不可变列表)。
最后,请注意 aHashSet
通过检查两个对象是否具有相同的hashCode
. 除非元素以相同的顺序出现,否则包含相同元素的列表仍不被视为相同列表,并且通常不会被视为重复项。然而,集合以这样一种方式实现equals
,hashCode
即包含完全相同元素的两个集合被认为是相等的(顺序无关紧要)。
使用您的原始起始集合,您可以将每个内部列表转换为一个集合。然后,从外部集合中消除重复项。最后,将内部集合转换回列表,以保持与其余代码的兼容性(如果需要)。无论内部列表的大小如何,这种方法都将起作用。
您可以使用 , 模拟这些步骤Stream
,并使用方法引用与 进行转换Set
,如下所示。
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.stream.Collectors;
public class Example {
public static void main( String[] args ) {
List<Integer> list1 = Arrays.asList(1, 0);
List<Integer> list2 = Arrays.asList(0, 1);
List<Integer> list3 = Arrays.asList(3, 2);
List<Integer> list4 = Arrays.asList(2, 3);
List<List<Integer>> lists = Arrays.asList(list1, list2, list3, list4);
System.out.println(getUnduplicateList(lists));
}
public static List<List<Integer>> getUnduplicateList(List<List<Integer>> lists) {
return lists
.stream()
.map(HashSet::new)
.distinct()
.map(ArrayList::new)
.collect(Collectors.toList());
}
}
推荐阅读
- django - django中修改的urlpatterns
- php - 在 redirectToRoute 中发送参数并在控制器中获取它
- reactjs - 如何向数组中的现有对象添加新值
- matplotlib - 多图成单图
- agda - 在 agda 的可判定性框架内工作
- c# - 根据asp.net中的选择将菜单设置为活动类
- angular - 使用参数转换管道
- json - 在 Mongodb 中使用聚合、查找和管道进行查询
- reactjs - 模式:在 React 中实现配置菜单的正确方法
- python - 在库“/usr/lib/R/lib/libR.so”中找不到 rpy2 错误符号“R_tryCatchError”