2010-07-09 38 views
2
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,但我不知道如何实施ArrayListArrayList比较ArrayList删除重复的线<ArrayList中<String>>

THX

+1

一些示例将有助于阐明您的意图。 – polygenelubricants 2010-07-09 11:54:43

+0

查看“在C#中删除列表中的重复项” http://stackoverflow.com/questions/47752/remove-duplicates-from-a-listt-in-c – Gage 2010-07-09 12:03:30

+0

@Gage:原理当然是一样的,但是这个问题被标记为'[java]'。 – 2010-07-09 15:53:08

回答

4

您可以尝试使用集合< List> - 如果您实现自己的List或扩展ArrayList os,那么“equals()”按照您的期望行事。

所以,当你添加一个arrayList时,它会自动与其余的进行比较。

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

你的情况如何?


你说你要使用LinkedHashSet - 好吧,这是一样的我的初步建议。 (你不需要比较) 你可以扩展ArrayList和使其 “的equals()” 方法符合你的愿望:

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

你将不得不做蛮力比较和每一个ArrayList中对所有其他数组列表进行比较。

开始索引为0,并比较其反对指引元件的1-N一旦你找到一个

Assumeing的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)); 

    } 
} 

的比较方法,你会想要写一个为循环遍历所有元素,比较两个arrayLists中每个索引处的项目,如果它们不是相同的长度,则不需要比较它们就可以将其短路。

你可能想要标记你想在一个单独的arraylist中删除的索引,并在一个单独的循环中删除它们,否则你会搞砸你的索引。

实现应该相当简单,所以这只是一个练习。

0

说列表中包含

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

你期望的设置为C什么ontain?两个要素?一个元素?

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

如果是一个对一个比较 - “他们是平等的,如果它们包含在相同顺序相同元素”,然后

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

应该足够了。

如果你想有更复杂的比较规则,那么你需要重写Leni Kirilov上面所说的equals方法。但是列表越大,您的性能开销就越高。

+0

thx所有的答案。你提供的列表是不一样的,所以可以添加。我需要一对一的比较,但你的代码与main相同,不起作用。所有重复都不会被删除。你说覆盖equals(),你有任何例子如何?如果我重写equals()我也需要重写hashCode。 – senzacionale 2010-07-09 12:30:33

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

与@Leni以上同意,只是覆盖的ArrayList的等于方法和LinkedHashSet实现应该自动过滤重复项。

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

+0

它永远不会“只是覆盖等于”,显然不是当你立即将它用于哈希集合。需要重写hashCode。 – 2010-07-09 19:09:12

相关问题