过滤列表<list <string>&gt;

时间:2017-11-17 12:00:30

标签: java list

我正在尝试编写一个方法来过滤字符串列表列表中的重复输入。问题是,通过重复,我的意思是具有相同元素的列表以不同的顺序。如果输入列表是:

,我希望如此
[["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)。有没有可能实现的解决方案?

4 个答案:

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