Groovy如何忽略元素顺序比较两个列表的元素是否完全一致
问题原因分析
你原有代码不生效的核心原因是:如果list1、list2本身就已经是列表类型,Arrays.asList(list1)会将整个列表作为单个元素封装为新的列表,转HashSet后实际存储的是列表对象而非列表内的元素,自然无法得到正确的比较结果。
正确实现方案
场景1:忽略元素重复次数,仅确认元素种类完全一致
直接将列表转为HashSet比较即可,不需要额外套Arrays.asList:
// Java 写法 assert new HashSet<>(list1).equals(new HashSet<>(list2)); // 如果你用的是Groovy环境(示例中用了def关键字)写法更简单 assert list1.toSet() == list2.toSet()
场景2:需要考虑元素重复次数(比如list1有2个"ABC",list2只有1个则判定为不相等)
这种场景不能直接用HashSet(会自动去重),需要先对两个列表排序后再比较:
// Java 写法 List<String> sortedList1 = new ArrayList<>(list1); List<String> sortedList2 = new ArrayList<>(list2); Collections.sort(sortedList1); Collections.sort(sortedList2); assert sortedList1.equals(sortedList2); // Groovy 写法 assert list1.sort() == list2.sort()
注意:如果列表中存储的是自定义对象,需要确保对象重写了
equals()和hashCode()方法,否则无论是转Set比较还是排序后比较都会失效。
内容的提问来源于stack exchange,提问作者Cata
相关产品推荐
相关产品推荐

