Java 删除ArrayList中的重复行
我想删除ArrayList中重复的行,我想使用LinkedHashSet并比较它们之间的ArrayList,如果相同,则不插入它。我知道我需要Comparator,但我不知道如何实现它来比较ArrayList中的ArrayListJava 删除ArrayList中的重复行,java,collections,Java,Collections,我想删除ArrayList中重复的行,我想使用LinkedHashSet并比较它们之间的ArrayList,如果相同,则不插入它。我知道我需要Comparator,但我不知道如何实现它来比较ArrayList中的ArrayList Thx您将不得不进行蛮力比较,并将每个arraylist与每个其他数组列表进行比较 从索引0开始,找到一个 假定ArrayList myDatastructure符合psuedo代码: public void removeDuplicates (ArrayList&l
Thx您将不得不进行蛮力比较,并将每个arraylist与每个其他数组列表进行比较 从索引0开始,找到一个 假定ArrayList myDatastructure符合psuedo代码:
public void removeDuplicates (ArrayList<ArrayList<String>> strings) {
Set<ArrayList<String>> s = new LinkedHashSet<ArrayList<String>>(strings);
strings = new ArrayList<ArrayList<String>>(s);
}
对于compare方法,您需要编写一个for循环,逐个遍历元素,比较两个arrayLists中每个索引处的项,如果它们的长度不相同,则不必费心进行比较,从而缩短这一过程
您可能希望在单独的arraylist中标记要删除的索引,并在单独的循环中删除它们,否则将导致索引出错
实现应该相当简单,所以这只是一个练习。您可以尝试使用Set
- -如果您实现自己的List或扩展ArrayList操作系统,equals将按照您期望的方式运行
因此,当您添加一个arrayList时,它将自动与其他arrayList进行比较
不确定当您先添加ArrayList,然后用元素填充它们时会发生什么
你的情况如何
你说你想使用LinkedHashSet-好的,这和我最初的建议是一样的。
你不需要比较器
您可以扩展ArrayList并使其equals方法符合您的要求:
相同数量的元素
相同元素
等
假设列表包含
for (int i =0; i < myDatastructure.count() ; i++){
for (int j = i+1 ; i< mydatastructure.count() ; j++){
compare(myDatastructure.get(i),myDataStructure.get(j));
}
}
你希望这个集合包含什么?两个要素?一个元素
你能告诉我你想如何比较ArrayList吗
如果这是一对一的比较——如果它们以相同的顺序包含相同的元素,那么它们是相等的
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
应该足够了
如果您想拥有更复杂的比较规则,那么您需要重写上面Leni Kirilov所说的equals方法。但是列表越大,性能开销就越大。您没有提到订单是否重要 如果内部列表中的项目顺序不重要,则应采用以下方法:-
sets = new HashSet<ArrayList<String>>(lists);
同意上面的@Leni,只需重写ArrayList的equals方法,LinkedHashSet实现就会自动过滤重复项
来自Java文档:不包含重复元素的集合。更正式地说,集合不包含一对元素e1和e2,例如e1.Equals2,最多包含一个空元素。正如其名称所暗示的那样,此接口对数学集合抽象进行建模一些示例将有助于澄清您的意图。请查看C@Gage中的“从列表中删除重复项”:原理当然是相同的,但此问题被标记为[java]是的,我注意到了,在我发布之后,我留下了它,因为就像你说的,samethx都是为了答案。您提供的列表不相同,因此可以添加。我需要一对一的比较,但您的代码与main相同,无法工作。不会删除所有重复项。你说覆盖等于,你有什么例子吗?如果我覆盖等于,我也需要覆盖hashCode。它绝不只是覆盖等于,显然不是当你要立即将其用于哈希集合时。需要重写哈希代码。
List<List<String>> list = new ArrayList<List<String>>();
list.add(Arrays.asList(new String[] {
"a",
"b",
"c"
}));
list.add(Arrays.asList(new String[] {
"b",
"a",
"c"
}));
list.add(Arrays.asList(new String[] {
"a",
"b",
"c",
"d"
}));
// use set to remove duplicates
Set<Set<String>> set = new HashSet<Set<String>>();
for (List<String> innerList : list) {
set.add(new HashSet<String>(innerList));
}
// convert back to list
List<List<String>> noDupList = new ArrayList<List<String>>();
for (Set<String> innerSet : set) {
noDupList.add(new ArrayList<String>(innerSet));
}
// print out for debugging
for (List<String> l : noDupList) {
System.out.println(l);
}