java - 如何使用自定义比较器比较两个数组列表是否相等?

标签 java generics collections comparison

具体来说,我有两个列表:

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);

最佳答案

只需实现迭代的方法,并在每次需要时重用它:

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;
}

关于java - 如何使用自定义比较器比较两个数组列表是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30106376/

相关文章:

java - JPA - 保存方法寻找连接表而不是更新记录

java - 为什么在离开泛型运算符时不推断类型

java - Collections.shuffle(list) 不会打乱我的列表

java - 为什么API在ArrayList中子列表的列表迭代器的next()中抛出Concurrent Modification Exception?

java - 时间:下周五怎么过?

c# - 如何检索 .NET 运行时生成的所有封闭泛型类型的列表?

c# - 基于 <T> 类型在运行时动态创建 lambda 谓词

java - 与 Collection 值(value)比较

java - JPA (orphanRemoval = true) 实现

java - 为什么我必须按 Enter 两次此 JFormattedTextField 才能激活 JDialog 的默认按钮?