我在列表中查找重复项时遇到问题。
[[I1, I2, I5], [I1, I2, I3], [I1, I2, I5], [I1, I2, I3], [I1, I5, I2], [I1, I3, I2]]
我想从列表中删除同一子集。
for(int i=0;i<ProdSetSuport3.size()-1;i++){
for(int j=i+1;j<ProdSetSuport3.size();j++){
List<List<String>> tmpSet = new ArrayList<List<String>>();
if(!ProdSetSuport3.get(j).contains(ProdSetSuport3.get(i).get(0))
&& ProdSetSuport3.get(j).contains(ProdSetSuport3.get(i).get(1))
&& ProdSetSuport3.get(j).contains(ProdSetSuport3.get(i).get(2)))
{
tmpSet.add(ProdSetSuport3.get(j));
}
}
}
我尝试使用HashSet,但是HashSet无法删除!
请帮助我!
答案 0 :(得分:0)
尝试使用兼容的Java8 +
HashSet<String> set = new HashSet<String>();
List<String> dupicateList = new ArrayList<>();
for (List<String> innerList : ProdSetSuport3) {
innerList.forEach(value -> {
if (set.contains(value)) {
dupicateList.add(value);
} else {
set.add(value);
}
});
}
dupicateList包含所有重复项。
答案 1 :(得分:0)
HashSet
似乎也可以处理List
个项目:
List<List<String>> lists=Arrays.asList(
Arrays.asList("I1", "I2", "I5"),
Arrays.asList("I1", "I2", "I3"),
Arrays.asList("I1", "I2", "I5"),
Arrays.asList("I1", "I2", "I3"),
Arrays.asList("I1", "I5", "I2"),
Arrays.asList("I1", "I3", "I2")
);
List<List<String>> filtered=new ArrayList<>();
List<List<String>> duplicates=new ArrayList<>();
HashSet<List<String>> filter=new HashSet<>();
for(List<String> list: lists){
if(!filter.contains(list)){
filter.add(list);
filtered.add(list);
} else {
duplicates.add(list);
}
}
System.out.println("Original: "+lists);
System.out.println("Filtered: "+filtered);
System.out.println("Duplicates: "+duplicates);
System.out.println("(Filter: "+filter+")");
输出:
Original: [[I1, I2, I5], [I1, I2, I3], [I1, I2, I5], [I1, I2, I3], [I1, I5, I2], [I1, I3, I2]] Filtered: [[I1, I2, I5], [I1, I2, I3], [I1, I5, I2], [I1, I3, I2]] Duplicates: [[I1, I2, I5], [I1, I2, I3]] (Filter: [[I1, I3, I2], [I1, I5, I2], [I1, I2, I5], [I1, I2, I3]])
“原始”行与您写的相同
“已过滤”行已删除重复项
“重复项”行表明重复元素已正确收集
“((过滤器)”行)表明,如果仅需要过滤后的元素集而不需要实际列表,则HashSet
本身已经包含了结果(并且使用LinkedHashSet
甚至可以保留原始顺序) 。仅获得此行,可以使用一个简单的循环for(List<String> list: lists) filter.add(list);
HashSet<HashSet<String>> filter=new HashSet<>();
for(List<String> list: lists){
HashSet<String> key=new HashSet<>(list);
if(!filter.contains(key)){
filter.add(key);
filtered.add(list);
} else {
duplicates.add(list);
}
}
输出变为:
Original: [[I1, I2, I5], [I1, I2, I3], [I1, I2, I5], [I1, I2, I3], [I1, I5, I2], [I1, I3, I2]] Filtered: [[I1, I2, I5], [I1, I2, I3]] Duplicates: [[I1, I2, I5], [I1, I2, I3], [I1, I5, I2], [I1, I3, I2]] (Filter: [[I1, I2, I3], [I1, I2, I5]])
这是正确的,只要三元组不包含重复项(例如,HashSet
和L1-L2
的内部L1-L1-L2
都将是L1-L2-L2
,则标记为一个它们重复)。如果那是有效的情况,我建议创建列表的有序副本并将其用作键。