Java 删除ArrayList中的重复行

Java 删除ArrayList中的重复行,java,collections,Java,Collections,我想删除ArrayList中重复的行,我想使用LinkedHashSet并比较它们之间的ArrayList,如果相同,则不插入它。我知道我需要Comparator,但我不知道如何实现它来比较ArrayList中的ArrayList Thx您将不得不进行蛮力比较,并将每个arraylist与每个其他数组列表进行比较 从索引0开始,找到一个 假定ArrayList myDatastructure符合psuedo代码: public void removeDuplicates (ArrayList&l

我想删除ArrayList中重复的行,我想使用LinkedHashSet并比较它们之间的ArrayList,如果相同,则不插入它。我知道我需要Comparator,但我不知道如何实现它来比较ArrayList中的ArrayList


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