列表的java筛选器<List<String>>
我正在尝试编写一个方法来过滤字符串列表中的重复输入。问题是,我所说的“重复”指的是具有相同元素但顺序不同的列表。如果输入列表是:
[["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,因为我无法同时修改和迭代同一个集合。将列表添加到集合中不会解决问题,因为它们不是完全重复的(.equals将返回false)。是否有任何可能的解决方案来实现这一目标
# 1 楼答案
您正在尝试实现一个集合,集合已经是JavaAPI的一部分,下面是链接Set (Java API)
# 2 楼答案
使用equals方法为内部列表创建一个新类,该方法可以满足您的需要。你可以用一套来做这个
# 3 楼答案
我建议你先对每个列表进行排序,这样更容易确定它们何时相等。完成后,消除重复项的一个简单方法是将它们添加到
Set
一种方法可能是这样的:
结果在输出
[[1, 2, 3]]
# 4 楼答案
首先,为了避免ConcurrentModificationException——创建一个新列表,只复制在原始列表上迭代的值,这些值以前没有复制过
其次,您可以创建一个映射/集,其中包含已复制的值,以检查重复项。为了实现这一点,在将值放入映射/集合之前,以及在检查它们是否已经存在之前,需要对内部列表进行排序