Groovy: 比较列表忽略其中元素的顺序

Groovy: Compare lists ignoring the order of elements in them

我有两个列表,比方说:

def list1 = ["ABC", "DEF", "GHI", "JKL"]
def list2 = ["ABC", "DEF", "JKL", "GHI"]

我想比较这两个列表并确保它们的值相同,尽管它们出现的顺序不同。

我已经试过了,但似乎不起作用:

 assert new HashSet( Arrays.asList(list1)).equals(new HashSet( Arrays.asList(list2)))

谁能指出我正确的方向? 非常感谢。

您的比较无效,因为您比较的是列表集。 new HashSet(Arrays.asList()) 创建一个 HashSet<List<String>>(大致),当检查 Set 相等性时,元素比较调用通常的 List.equals,这不起作用,因为列表中的顺序很重要。

您的列表应该在目标集中创建平面元素,以便它基于集合比较逻辑工作(这样您就可以比较 HashSet<String> 而不是 HashSet<List<String>> 的实例)。你的代码应该是

new HashSet(list1).equals(new HashSet(list2))

如果您想继续使用 List 而不使用 Set,您可以比较排序列表:

def list1 = ["ABC", "DEF", "GHI", "JKL"]
def list2 = ["ABC", "DEF", "JKL", "GHI"]

assert list1 != list2
assert list1.sort() == list2.sort()

建议的基于集合的比较可能很危险,因为列表包含不同数量的重复项:

def list1 = ["ABC"]
def list2 = ["ABC", "ABC", "ABC"]

assert list1.sort() != list2.sort()
assert list1 as Set == list2 as Set // GOTCHA!