当前位置: 首页 > 知识库问答 >
问题:

Java系列。排序比较方法违反了其一般约定

公羊英达
2023-03-14

从昨天开始,我的代码中出现了错误,我不知道为什么!我用谷歌搜索了很多,找到了这个堆栈帖子。

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

读完zhe 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;
        }
    });
}

共有1个答案

苏鸿卓
2023-03-14
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)

或类似。

 类似资料:
  • 以下几行: 返回以下异常:比较方法违反了其一般约定! 我知道这个异常通常是在没有正确实现比较方法时产生的,但是在我的例子中,它的实现是相当明显的: 正如您所看到的,目标是按照值的hashValue属性对值进行排序。 任何关于我做错了什么的想法/提示将不胜感激! 谢谢托马斯

  • 我想通过dateLastContact比较两个“收件人”,如果相同,就通过地址进行比较。这是我的代码: 而且我总是有这个错误: 我尝试了很多方法,但是现在,我不知道该怎么办。你能帮我吗? 收件人类别:

  • 我知道它已经被询问和回答了数百万次,但我仍然无法弄清楚为什么我在排序期间收到了违规。这是我的代码: 我收到了这个错误 有什么想法吗?

  • 问题内容: 我有以下代码: 每次我运行此代码时,都会出现此错误: 我使用OpenJDK7u3,当对象相等时返回0。有人可以向我解释这个错误吗? 问题答案: 如果您有任何NaN值,则可能会遇到这种情况: 例如: 所有 这些打印。因此,您可能会遇到以下两种情况:两个非NaN值都被认为与NaN“相等”,但是一个大于另一个。基本上,您应该弄清楚如何处理NaN值。当然,还要检查这确实是问题所在……您是否真的

  • 我收到以下错误: 比较方法违反了其总合同! 这是我的比较法 我想比较项目的分数。但是当分数相同时,我想按名称对它们进行排序。 我需要更改什么,为什么会出现这个错误? 编辑: 分数是一个,itemname一个。 这是 ComparableItem 类: 这是MenuList项目类:

  • 我知道有很多问题与这个主题有关,但我不能完全理解是什么导致了这个错误 有人知道为什么它不起作用以及如何修复它吗?