Bru*_*yne 5 java generics collections comparison
具体来说,我有两个清单:
List<SystemUserWithNameAndId> list1;
List<SystemUserWithNameAndId> list2;
Run Code Online (Sandbox Code Playgroud)
我想检查它们是否包含相同的系统用户,并且订购不是问题.我尝试先使用比较器对它们进行排序,然后使用列表的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);
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望能够说,
CollectionUtils.isEqualCollections(systemUsers1, systemUsers2, someCustomComparator);
Run Code Online (Sandbox Code Playgroud)
只需实现迭代的方法,并在每次需要时重用它:
public static <T> boolean areEqualIgnoringOrder(List<T> list1, List<T> list2, Comparator<? super T> comparator) {
// if not the same size, lists are not equal
if (list1.size() != list2.size()) {
return false;
}
// create sorted copies to avoid modifying the original lists
List<T> copy1 = new ArrayList<>(list1);
List<T> copy2 = new ArrayList<>(list2);
Collections.sort(copy1, comparator);
Collections.sort(copy2, comparator);
// iterate through the elements and compare them one by one using
// the provided comparator.
Iterator<T> it1 = copy1.iterator();
Iterator<T> it2 = copy2.iterator();
while (it1.hasNext()) {
T t1 = it1.next();
T t2 = it2.next();
if (comparator.compare(t1, t2) != 0) {
// as soon as a difference is found, stop looping
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)