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!
我有两个列表,比方说:
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!