java - 比较法违反其使用日期的一般合同例外
问题描述
我在下面使用一个简单的比较器按比赛的开始时间进行排序,但我收到错误“比较方法违反其一般合同”,即使我涵盖了所有可能性。对我所缺少的有任何帮助吗?
Collections.sort(contests, new Comparator<Contest>() {
@Override
public int compare(Contest o1, Contest o2) {
if (o1.getStartTime() != null && o2.getStartTime() != null) {
if (o1.getStartTime().getTime() < o2.getStartTime().getTime()) {
return -1;
}
return 1;
}
return 1;
}
});
解决方案
我没有看到它返回 0 的任何情况。当进一步观察时,我发现比较具有相同开始时间的 2 个对象时的返回值将是 1。因此,违反了以下合同规则:
sgn(compare(x, y)) == -sgn(compare(y, x))
如果 x 和 y 具有相同的开始时间。sgn(1) != -sgn(1)。在这种情况下,该方法必须返回 0。
推荐阅读
- bash - shell:将十进制转换为本机十六进制数
- c# - Google 日历问题 - 接口和导入
- android-studio - 如何可变地添加到arrayOf
() 在 Kotlin 中? - javascript - 将图像 url 转换为文件 JavaScript
- android - 是否可以创建一个APK来安装媒体文件,没有应用程序
- javascript - 将包含逗号“,”的文本输入分隔到不同的数组对象中
- javascript - 带有 mailto 链接的 Chrome“启动外部处理程序”控制台语句
- c# - 在 C# 中读取编辑和写入 .bin 文件
- kubernetes - 如何在 Kubernetes 上使用 WebRTC 和 RTCPeerConnection?
- angular - 为什么我在 NGXS 中的选择器函数在填充状态时收到 null?