删除ArrayList中的重复行<arraylist <string>&gt; </arraylist <string>

时间:2010-07-09 11:27:26

标签: java collections

public void removeDuplicates (ArrayList<ArrayList<String>> strings) {

    Set<ArrayList<String>> s = new LinkedHashSet<ArrayList<String>>(strings);
    strings =  new ArrayList<ArrayList<String>>(s);
}

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

Thx

5 个答案:

答案 0 :(得分:4)

您可以尝试使用Set&lt;列表&gt; - 如果您实现自己的List或扩展ArrayList,那么“equals()”就会按照您的预期行事。

因此,当您添加一个arrayList时,它将自动与其余部分进行比较。

不确定首先添加arrayLists然后用元素填充它们会发生什么。

你的情况是什么?


你说你想使用LinkedHashSet - 好的,这与我最初的建议相同。 (你不需要比较器) 您可以扩展ArrayList并使其“equals()”方法符合您的愿望:

  • 相同数量的元素
  • 相同的元素
  • 等...

答案 1 :(得分:1)

您没有提及订单是否重要。

如果内部列表中的项目顺序不重要,则应该起作用: -

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

答案 2 :(得分:0)

你将不得不进行暴力比较并将每个arraylist与其他所有数组列表进行比较。

从索引0开始,并在找到

后将其元素与索引1-n进行比较

在伪代码之后假设ArrayList myDatastructure:

for (int i =0; i < myDatastructure.count() ; i++){

    for (int j = i+1 ; i< mydatastructure.count() ; j++){
      compare(myDatastructure.get(i),myDataStructure.get(j));

    }
}

对于比较方法,您将要编写一个for循环,逐个遍历元素,比较两个arrayLists中每个索引处的项目,如果它们不是,则需要通过不打扰来比较它们来使其短路相同的长度。

您可能希望在单独的arraylist中标记要删除的索引,并在单独的循环中删除它们,否则您将搞砸索引。

实施应该相当简单,因此留作练习。

答案 3 :(得分:0)

说清单包含

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

您希望该套装包含什么?两个元素?一个元素?

你能告诉你如何比较ArrayLists吗?

如果这是一对一的比较 - “如果它们在相同的顺序中包含相同的元素,它们是相同的”那么

sets = new HashSet<ArrayList<String>>(lists);

应该足够了。

如果你想拥有更复杂的比较规则,那么你需要覆盖equal方法,正如Leni Kirilov所说的那样。但是列表越大,您的性能开销就越高。

答案 4 :(得分:0)

同意上面的@Leni,只需覆盖 ArrayLists的 等于方法, LinkedHashSet 实现应自动过滤重复项。

来自Java doc:不包含重复元素的集合。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。正如其名称所暗示的,此接口模拟数学集抽象