在list <list <string >> java

时间:2018-11-25 12:19:49

标签: java

我在列表中查找重复项时遇到问题。

[[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无法删除!

请帮助我!

2 个答案:

答案 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]])

这是正确的,只要三元组不包含重复项(例如,HashSetL1-L2的内部L1-L1-L2都将是L1-L2-L2,则标记为一个它们重复)。如果那是有效的情况,我建议创建列表的有序副本并将其用作键。