有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

列表的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)。是否有任何可能的解决方案来实现这一目标


共 (4) 个答案

  1. # 1 楼答案

    您正在尝试实现一个集合,集合已经是JavaAPI的一部分,下面是链接Set (Java API)

  2. # 2 楼答案

    使用equals方法为内部列表创建一个新类,该方法可以满足您的需要。你可以用一套来做这个

  3. # 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]]

  4. # 4 楼答案

    首先,为了避免ConcurrentModificationException——创建一个新列表,只复制在原始列表上迭代的值,这些值以前没有复制过

    其次,您可以创建一个映射/集,其中包含已复制的值,以检查重复项。为了实现这一点,在将值放入映射/集合之前,以及在检查它们是否已经存在之前,需要对内部列表进行排序