Java Collections.Sort比较方法违反其常规协定

Mih*_*awk 0 java collections

从昨天开始,我的代码中出现错误,我不确定为什么!我在Google上搜索了很多,然后找到了 Stack-Post。

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

在阅读了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;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

And*_*ner 9

comp = user1.getCreateDate().before(user2.getCreateDate()) ? -1 : 1;
Run Code Online (Sandbox Code Playgroud)

如果日期相等,则该行永远不会返回零。这意味着它不是反对称的(即sgn(a.compareTo(b)) = -sgn(b.compareTo(a)))。

确切的解决方法取决于getCreateDate()返回的类,但是可能类似于:

comp = user1.getCreateDate().compareTo(user2.getCreateDate());
Run Code Online (Sandbox Code Playgroud)

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

Comparator.comparing(Users::getUsername).thenComparing(Users::getCreateDate)
Run Code Online (Sandbox Code Playgroud)

或类似。