java - java比较器如何在内部工作?
问题描述
class Checker implements Comparator<Player> {
@Override
public int compare(Player p1, Player p2) {
if (p1.score == p2.score) {
return p1.name.compareTo(p2.name);
} else {
return p2.score - p1.score;
}
}
}
p2.score - p1.score 如何使其下降,而 p1.score - p2.score 使其上升
正整数或负整数或零返回如何对对象进行排序?内部发生了什么
请帮忙谢谢
解决方案
一个比较函数,它对某些对象集合进行总排序。...
...
回报:
作为第一个参数的负整数、零或正整数小于、等于或大于第二个参数。
因此,Comparator
唯一定义了顺序。由排序算法来使用这些信息并对数据结构进行实际排序。如果我们看一下,例如快速排序和合并排序是如何工作的,我们会发现这些算法只需要知道某个元素a
是否小于、等于或大于b
,这是 aComparator
提供的信息(通过返回一个值< 0
,= 0
或> 0
) .
现在让我们解释一下如何a - b
使它按升序排序(让我们给它Comparator
命名asc
),同时b - a
让它按降序排序((让我们给它Comparator
命名desc
):我们必须看看这两个Comparator
s 的三种不同情况。
首先,假设a > b
. 然后
a - b > 0
,因此a
比b
根据asc
b - a < 0
,因此a
比b
根据desc
接下来,假设a < b
. 然后
a - b < 0
因此a
比b
根据asc
b - a > 0
,因此a
比b
根据desc
最后,假设a == b
. 然后a - b == b - a == 0
根据两个Comparator
s 元素是“相等的”。
推荐阅读
- asp.net - 在 Visual Studio 2017 中使用 IIS express 的 ERR_CONNECTION_RESET
- git - 为什么从 git rebase 丢弃的提交会导致合并冲突?
- c# - 我想用数组替换文本文件中的数据并将其存储在变量中
- java - Restcomm USSD网关安装(社区版)
- cmake - cmake:如果项目未使用手动指定的变量,则停止
- javascript - 条形图上的 Echarts 富文本图标
- java - 公钥加密 - 使用 Java
- javascript - 当队列“满”时暂停循环
- hyperledger-fabric - 实例化 java 链码时出现 Hyperledger Fabric Java SDK 错误
- javascript - 有没有办法将换行符放入 JSX 字符串中,以便它们显示在 HTML 中