我们的一些用户在排序列表时遇到了这个异常。抛出它的代码是
Collections.sort(activeConverstions, new Comparator<Conversation>() {
@Override
public int compare(Conversation o1, Conversation o2) {
return (int)(o2.getTime()- o1.getTime()); // descending order
}
});
而 getTime() 的类型为 “long”
实现比较
方法的最佳实践是只返回-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,getTime(), o1.getTime());
}
});
你可以试试这个
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;
}
});
问题可能是将长整型
转换为 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,getTime(), o1.getTime());
}
});
我想通过dateLastContact比较两个“收件人”,如果相同,就通过地址进行比较。这是我的代码: 而且我总是有这个错误: 我尝试了很多方法,但是现在,我不知道该怎么办。你能帮我吗? 收件人类别:
首先,很抱歉再次就这个话题提问。我很清楚这里有很多问题和答案。我已经读了其中的一些,但我的问题是我仍然不知道我做错了什么。这是我的代码: 看来我只是瞎了眼,看不到我的错误,所以如果你们中有人能帮我解决这个问题,我将非常感谢。 编辑:我想做的是确定一条线在左上角有0/0坐标的坐标系中是上、下、最左还是最右。这些点是double类型的。下面是错误消息:
我收到以下错误: 比较方法违反了其总合同! 这是我的比较法 我想比较项目的分数。但是当分数相同时,我想按名称对它们进行排序。 我需要更改什么,为什么会出现这个错误? 编辑: 分数是一个,itemname一个。 这是 ComparableItem 类: 这是MenuList项目类:
我知道有很多问题与这个主题有关,但我不能完全理解是什么导致了这个错误 有人知道为什么它不起作用以及如何修复它吗?
问题内容: 我有以下代码: 每次我运行此代码时,都会出现此错误: 我使用OpenJDK7u3,当对象相等时返回0。有人可以向我解释这个错误吗? 问题答案: 如果您有任何NaN值,则可能会遇到这种情况: 例如: 所有 这些打印。因此,您可能会遇到以下两种情况:两个非NaN值都被认为与NaN“相等”,但是一个大于另一个。基本上,您应该弄清楚如何处理NaN值。当然,还要检查这确实是问题所在……您是否真的
我正在开发一个旧的应用程序,最初是在Java6编写的,几年前升级到Java7。 在这个应用程序中,我使用集合。通过实现接口,使用自定义方法对列表进行排序。列表中的对象类型是,它具有3个属性、和。 列表可以包含多个具有相同但具有唯一过期日期的对象。下面的比较函数按公司名称的升序对列表进行排序,并在同一公司名称列表中按过期日期的降序进行排序。下面是方法实现。 我知道,当在上面的比较方法实现中不满足可传