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 Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- 降序排序:Java Map 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01