首页 > 解决方案 > Java Collections.Sort 比较方法违反了它的一般约定

问题描述

从昨天开始,我的代码出现错误,我不知道为什么!我用谷歌搜索了很多,发现了这个Stack-Post。

我使用此功能按名称对用户进行排序并创建日期。这个功能已经工作了 2 年,现在我收到一个用户的错误,我不知道发生了什么变化。我试图检查我的数据是否有任何损坏但找不到任何问题。

在阅读了 zh Stack-Post 之后,我仍然没有完全理解我的项目有什么问题或发生了什么变化。

public void sortUsers(List<Users> sortList) {
    Collections.sort(sortList, new Comparator<Users>() {
        public int compare(Users user1, Users user2) {
            Integer comp = 0;
            comp = user1.getUsername().compareTo(user2.getUsername());
            if (comp == 0) {
                comp = user1.getCreateDate().before(user2.getCreateDate()) ? -1 : 1;
            }

            return comp;
        }
    });
}

标签: javacollections

解决方案


comp = user1.getCreateDate().before(user2.getCreateDate()) ? -1 : 1;

在日期相等的情况下,此行永远不会返回零。这意味着它不是反对称的(即sgn(a.compareTo(b)) = -sgn(b.compareTo(a)))。

确切的修复取决于getCreateDate()返回的类,但它可能类似于:

comp = user1.getCreateDate().compareTo(user2.getCreateDate());

但是,构建兼容比较器的更简单方法是:

Comparator.comparing(Users::getUsername).thenComparing(Users::getCreateDate)

或类似的。


推荐阅读