【发布时间】: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)));