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
答案 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元素。正如其名称所暗示的,此接口模拟数学集抽象