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

收藏。sort-IllegalArgumentException:比较方法违反了其一般约定

许招
2023-03-14

我们的一些用户在排序列表时遇到了这个异常。抛出它的代码是

Collections.sort(activeConverstions, new Comparator<Conversation>() {
        @Override
        public int compare(Conversation o1, Conversation o2) {
            return (int)(o2.getTime()- o1.getTime()); // descending order
        }
    });

而 getTime() 的类型为 “long”

共有3个答案

商和颂
2023-03-14

实现比较方法的最佳实践是只返回-1、0或1。

    Collections.sort(activeConverstions, new Comparator<Conversation>() {
        @Override
        public int compare(Conversation o1, Conversation o2) {
            long result = o2.getTime()- o1.getTime();
            return result < 0 ? -1 : result > 0 ? 1 : 0;
        }
    });

编辑:

正如@assylias提到的,使用已经实现的比较方法更好:

    Collections.sort(activeConverstions, new Comparator<Conversation>() {
        @Override
        public int compare(Conversation o1, Conversation o2) {
            return Long.compare(o2,getT‌​‌​ime(), o1.getTime());
        }
    });
孙渝
2023-03-14

你可以试试这个

 Collections.sort(activeConverstions, 
    new Comparator<Conversation>()            {
    @Override
    public int compare(Conversation o1, Conversation o2) {
    if ((o2.getTime() > o1.getTime())
      return 1;
    else  if ((o2.getTime() < o1.getTime())
     return -1;
    else return 0;
    }
 });
微生善
2023-03-14

问题可能是将长整型转换为 int,这可能会将较大的数转换为负 int

例如,考虑以下代码片段:

long first = Integer.MAX_VALUE + 1;
long second = 0;
System.out.println((int) (first - second));
System.out.println((int) (second - first));

输出:

-2147483648
-2147483648

如果您将向< code>compare方法传递两个< code>Conversation实例,我们称它们为< code>x和< code>y,它们的< code>getTime()分别等于上面代码段中的< code>first和< code>second,那么< code>compare(x,y)和< code>compare(y,x)将返回负值,这违反了约定

尝试:

Collections.sort(activeConverstions, new Comparator<Conversation>() {
    @Override
    public int compare(Conversation o1, Conversation o2) {
        return o2.getTime() > o1.getTime() ? 1 :  o2.getTime() < o1.getTime() ? -1 : 0;
    }
});

或者,正如assylias所建议的:

Collections.sort(activeConverstions, new Comparator<Conversation>() {
    @Override
    public int compare(Conversation o1, Conversation o2) {
        return Long.compare(o2,getT‌​ime(), o1.getTime());
    }
});
 类似资料:
  • 我想通过dateLastContact比较两个“收件人”,如果相同,就通过地址进行比较。这是我的代码: 而且我总是有这个错误: 我尝试了很多方法,但是现在,我不知道该怎么办。你能帮我吗? 收件人类别:

  • 首先,很抱歉再次就这个话题提问。我很清楚这里有很多问题和答案。我已经读了其中的一些,但我的问题是我仍然不知道我做错了什么。这是我的代码: 看来我只是瞎了眼,看不到我的错误,所以如果你们中有人能帮我解决这个问题,我将非常感谢。 编辑:我想做的是确定一条线在左上角有0/0坐标的坐标系中是上、下、最左还是最右。这些点是double类型的。下面是错误消息:

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

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

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

  • 我正在开发一个旧的应用程序,最初是在Java6编写的,几年前升级到Java7。 在这个应用程序中,我使用集合。通过实现接口,使用自定义方法对列表进行排序。列表中的对象类型是,它具有3个属性、和。 列表可以包含多个具有相同但具有唯一过期日期的对象。下面的比较函数按公司名称的升序对列表进行排序,并在同一公司名称列表中按过期日期的降序进行排序。下面是方法实现。 我知道,当在上面的比较方法实现中不满足可传