【发布时间】:2015-05-07 16:07:48
【问题描述】:
具体来说,我有两个列表:
List<SystemUserWithNameAndId> list1;
List<SystemUserWithNameAndId> list2;
我想检查它们是否包含相同的系统用户并且订购不是问题。我尝试使用比较器先对它们进行排序,然后使用列表的 equals() 方法检查它们是否相等。但我不想覆盖 SystemUserWithNameAndId 的 equals 方法,我想知道是否可以使用我为排序创建的比较器或类似的比较器来检查相等性,而无需在排序后显式迭代列表。
Comparator<SystemUserWithNameAndId> systemUserComparator = new Comparator<SystemUserWithNameAndId>()
{
@Override
public int compare(SystemUserWithNameAndId systemUser1, SystemUserWithNameAndId systemUser2)
{
final int systemUserId1 = systemUser1.getSystemUserId();
final int systemUserId2 = systemUser2.getSystemUserId();
return systemUserId1 == systemUserId2
? 0
: systemUserId1 - systemUserId2;
}
};
Collections.sort(systemUsers1, systemUserComparator);
Collections.sort(systemUsers2, systemUserComparator);
return systemUsers1.equals(systemUsers2);
理想情况下,我想说,
CollectionUtils.isEqualCollections(systemUsers1, systemUsers2, someCustomComparator);
【问题讨论】:
-
为什么不想覆盖
SystemUserWithNameAndId.equals()?你已经覆盖它了吗? -
或者你可以做一个扩展 List 并覆盖 equals 的 SystemUsersList,然后你可以调用:list1.equals(list2);
-
我发布的代码是测试类的一部分,我比较两个
SystemUserWithNameAndId对象的方式不是比较它们的默认方式。 -
您使用的是 Java 8 吗?
-
@Radiodef 我会回答,但问题尚不清楚。 OP 是否想要根据
Comparator测试两个列表是否包含相同的元素(正如 JBNizet 假设的那样),或者Comparator只是测试两个列表是否包含与@相关的相同元素的一种方法987654328@?在问题中,OP 使用Comparator对列表进行排序,然后通过将元素与equals()进行比较来测试列表是否相同,这没有任何意义。
标签: java generics collections comparison