【问题标题】:How to detect a duplicate in a list of list in Java?如何检测 Java 列表中的重复项?
【发布时间】:2019-04-03 14:01:00
【问题描述】:

我想检测列表列表中的重复项。例如

[[-1,0,-1][0,1,2][0,-1,-1]]

我所说的重复是指一个列表是否包含任何顺序的相同元素。

我尝试了一种解决方案,即对列表进行排序并将它们中的每一个插入集合中。还有其他更好的方法吗?

我遇到的一个问题是,如果我将列表按原样插入而不进行排序,则它不会被检测为重复项。 (即 [-1,0,-1] 和 [0,-1,-1])

最后我想要的列表是,

[[-1,0,-1][0,1,2]]

请注意,Java: Best way to remove duplicated list in a list 此处回答了相同的问题,但与我在这里提出的问题略有不同。

【问题讨论】:

  • 我不确定集合相等性是如何工作的,但我认为如果你构建两个集合,每个集合具有相同的三个数字,它们就会相等。在正常(未排序的)集合中,顺序绝对无关紧要。 - 我刚试过这个。如果你构建两个集合,首先将 -1 加到一个然后 0,然后先加 0 然后 -1 到另一个,set1.equals(set2) == true
  • 根据 List.equals() 的定义,如果两个列表包含相同顺序的相同元素,则它们将相等。因此,当您将 ArrayLists 插入集合时,数组列表比较将开始,并且不会被检测为重复。所以你需要排序并插入到Set中
  • HashSet<Object> tmp = new HashSet<>(); listOfList.removeIf(list -> !tmp.add(new HashSet<>(list)));

标签: java java-8


【解决方案1】:

我不知道这是否是一种好方法,但我继续编写了您使用集合查找重复列表的想法。它工作正常:

class Test {

    public static void main(String[] args) {

        List<List<Integer>> input = (List<List<Integer>>)JsonEncodeDecode.decode("[[-1,0,-1],[0,1,2],[0,-1,-1]]");

        List<List<Integer>> result = new ArrayList<>();
        List<Set<Integer>> sets = new ArrayList<>();
        for (List<Integer> sublist : input) {
            Set<Integer> set = new HashSet<>(sublist);
            if (!sets.contains(set)) {
                sets.add(set);
                result.add(sublist);
            }
        }
        System.out.println(JsonEncodeDecode.encode(result));
    }
}

输出:

[[-1,0,-1],[0,1,2]]

JsonEncodeDecode 是我自己的实用程序类,因此如果不执行其他操作来对 JSON 进行编码/解码,您将无法运行它。这只是我构建结构和打印它们的方式。

【讨论】:

  • 你可能不想要的一件事是列表 [-1, -1, 0] 和 [-1, 0, 0] 也被视为相同,因为集合表示不保留原始列表中每个数字的数量。
  • 您应该将sets 更改为Set&lt;Set&lt;Integer&gt;&gt; sets = new HashSet&lt;&gt;();。然后,它不仅更高效,您还可以将循环体简化为if(sets.add(new HashSet&lt;&gt;(sublist))) result.add(sublist);
  • 知道了,谢谢@Steve。
【解决方案2】:

您可以使用此 Java8 功能,这将为您提供从一个到另一个的匹配列表。

list.stream().allMatch(num -&gt; matchingList.contains(num))

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2021-11-02
    • 1970-01-01
    • 2011-09-21
    • 2014-08-23
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多