我正在尝试编写一个方法来过滤字符串列表列表中的重复输入。问题是,通过重复,我的意思是具有相同元素的列表以不同的顺序。如果输入列表是:
,我希望如此[["1", "2","3"], ["2","1","3"],["3","1","2"]]
它只返回
[["1","2","3"]]
我尝试过这样的事情:
public List<List<String>> filter (List<List<String>> list){
List<List<String>> filteredList = new LinkedList<>();
filteredList.addAll(list);
for(List<String> i:list){
for(List<String> j:list){
if (!i.equals(j)&&i.containsAll(j)){
filteredList.remove(j);
}
}
}
return filteredList;
}
但它会删除太多,因为它仍会遍历整个原始列表,并会发现元素“a”与元素“b”重复,反之亦然。另一方面,当我尝试在同一个列表上执行此操作(没有临时)时,我得到ConcurrentModificationException,因为我无法同时修改和迭代同一个集合。将列表添加到Set不会解决问题,因为它们不是完全相同的(.equals将返回false)。有没有可能实现的解决方案?
答案 0 :(得分:3)
我建议你从排序每个列表开始,这样可以更容易地识别它们何时相等。一旦完成,消除重复的简单方法是将它们添加到Set
。
一种方法可能如下所示:
List<List<String>> lists = new ArrayList<>();
lists.add(Arrays.asList("1", "2", "3"));
lists.add(Arrays.asList("2", "1", "3"));
lists.add(Arrays.asList("3", "1", "2"));
lists.forEach(Collections::sort);
Set<List<String>> collect = lists.stream().collect(Collectors.toSet());
System.out.println(collect);
输出结果[[1, 2, 3]]
。
答案 1 :(得分:0)
使用equals-method为内部List创建一个新类,它可以满足您的需要。你可以使用一套。
答案 2 :(得分:0)
首先要避免ConcurrentModificationException - 执行一个新列表,只复制原始列表中迭代的值,之前尚未复制的值。
其次您可以创建一个地图/集,其中包含已经复制的值以检查重复项。要使这项工作,你需要在将值放入map / set之前和检查它们是否已存在之前对内部列表进行排序
答案 3 :(得分:-1)
您正在尝试实现一个Set,一个集已经是java API的一部分,这里是链接Set (Java API)