java - 为什么当 Comparator.compare 相等时我们需要返回 0
问题描述
我知道当实现 Comparator 接口的比较方法时,我们需要返回
- +1 如果 o1 > o2
- -1 如果 o1 < o2
- 0 如果 o1 == o2
我的问题是为什么我们需要在两者相等时返回 0?用例是什么或在哪里使用?如果我们考虑排序时 o2 大于 o1 或 o2 等于 o1 不会改变它的位置。任何人都可以来解释这个实际用例吗?
Java 文档说
比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个。
这是否意味着 return -1 或 return 0 具有相同的影响?
零或正整数
@Override
public int compare(Test f1, Test f2) {
if (f1.getId() > f2.getId()) {
return 1;
} else if (f1.getId() < f2.getId()) {
return -1;
} else {
return 0;
}
}
解决方案
如果在被比较的两个值相等时返回 -1,compare(f1,f2)
并且compare(f2,f1)
都将返回-1
. 这意味着您的元素的顺序将不一致。它可以破坏一些排序算法。
这就是为什么一般合同compare
要求:
sign(compare(f1,f2)) = -sign(compare(f2,f1))
这意味着当两个值相等时,您必须返回 0。
推荐阅读
- javascript - 数组元素未显示 JavaScript
- php - 保存在 Wordpress 中插入样式到文本的帖子时出现 403 错误(禁止)
- java - 匹配正则表达式时获取 java.lang.StackOverflowError
- python - Python 多处理池类的意外行为
- matrix - 如何在 SSRS 矩阵组中添加 % 列?
- google-api - Google Cloud Platform 服务已停用
- amazon-web-services - Dockerfile 从 amazon s3 或其他需要凭据的来源复制文件
- node.js - 如何在 Node JS 的 Chalk 中增加字体大小?
- python - 风格:以 `pass` 与 `return`/`continue` 结束代码块 vs 无
- python - 如何将变量从一个 netCDF4 文件复制到另一个文件?