Fatal Exception: java.lang.IllegalArgumentException: Comparison method violates its general contract(致命异常:java.lang.IlLegalArgumentException:比较方法违反其常规合同)
问题描述
我知道有很多类似的问题,我通过阅读这些问题的答案得到了很大的帮助,但我不能看到我的客户是如何面对这个问题的。而且只有一个客户端面临此问题。
我有一个列表,我正在使用比较器接口对该列表进行排序。您认为以下代码有问题吗?
private static class BiologySamplesComparator implements Comparator<BiologySample>, Serializable {
@Override
public int compare(BiologySample left, BiologySample right) {
if (left == right || (left != null && right != null && left.getSampleDateTime() == right.getSampleDateTime())) {
return 0;
}
if (left == null || left.getSampleDateTime() == null) {
return 1;
}
if (right == null || right.getSampleDateTime() == null) {
return -1;
}
return right.getSampleDateTime().compareTo(left.getSampleDateTime());
}
}
我就是这样调用这个函数的
Collections.sort(biologySamples, new BiologySamplesComparator());
我知道这种情况下的主要问题是传递性。然而,我想不出是什么违反了这条规定。
这是如何getSampleDateTime()返回日期09星期五17:00:00 PDT 2021
更新 这就是我能够解决我的问题的方法。 我希望这会有帮助,我在这个问题上被困了很长时间。
private static class BiologySamplesComparator implements Comparator<BiologySample>, Serializable {
@Override
public int compare(BiologySample left, BiologySample right) {
if (left == null) {
if (right == null) {
return 0;
} else {
return 1;
}
} else if (right == null) {
return -1;
} else if (left == right) {
return 0;
}
if (left.getSampleDateTime() == null) {
if (right.getSampleDateTime() == null) {
return 0;
} else {
return 1;
}
} else if (right.getSampleDateTime() == null) {
return -1;
} else if (left.getSampleDateTime() == right.getSampleDateTime()) {
return 0;
}
return right.getSampleDateTime().compareTo(left.getSampleDateTime());
}
}
推荐答案
我在某些情况下缺少一些条件,这就是我能够解决问题的方法。
private static class BiologySamplesComparator implements Comparator<BiologySample>, Serializable {
@Override
public int compare(BiologySample left, BiologySample right) {
if (left == null) {
if (right == null) {
return 0;
} else {
return 1;
}
} else if (right == null) {
return -1;
} else if (left == right) {
return 0;
}
if (left.getSampleDateTime() == null) {
if (right.getSampleDateTime() == null) {
return 0;
} else {
return 1;
}
} else if (right.getSampleDateTime() == null) {
return -1;
} else if (left.getSampleDateTime() == right.getSampleDateTime()) {
return 0;
}
return right.getSampleDateTime().compareTo(left.getSampleDateTime());
}
}
Why does my compare methd throw IllegalArgumentException sometimes?
提供这篇关于致命异常:java.lang.IlLegalArgumentException:比较方法违反其常规合同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:致命异常:java.lang.IlLegalArgumentException:比较方法


基础教程推荐
- 如何对 Java Hashmap 中的值求和 2022-01-01
- 修改 void 函数的输入参数,然后读取 2022-01-01
- 无法复制:“比较方法违反了它的一般约定!" 2022-01-01
- 问题http://apache.org/xml/features/xinclude测试日志4j 2 2022-01-01
- 存储 20 位数字的数据类型 2022-01-01
- REST Web 服务返回 415 - 不支持的媒体类型 2022-01-01
- Spring AOP错误无法懒惰地为此建议构建thisJoinPoin 2022-09-13
- Struts2 URL 无法访问 2022-01-01
- RabbitMQ:消息保持“未确认"; 2022-01-01
- 使用堆栈算法进行括号/括号匹配 2022-01-01