java - 这个 @Override for Arrays.sort 在 Java 中是如何工作的?
问题描述
Arrays.sort(people, (n1, n2) -> (n2[0] == n1[0])? n1[1] - n2[1] : n2[0] - n1[0]);
或者
Arrays.sort(people,new Comparator<int[]>(){
@Override
public int compare(int[] n1, int[] n2){
return (n2[0] == n1[0])? n1[1] - n2[1]: n2[0] - n1[0];
}
});
两者都执行相同的操作。
输入:[[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
输出:[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]
我知道代码正在分组排序,但我不明白如何。我同样对 Java 中的 PriorityQueue 感到困惑:
PriorityQueue<Integer> pq = new PriorityQueue<>((a, b)-> b - a);
这是按降序排列的。
有人可以解释一下吗?如果有任何此类材料,我在哪里可以学习或阅读有关这些“替代”的更多信息?
解决方案
箭头符号是一个 lambda 函数,是相同 Comparator 实现的简写。这就是为什么您会看到相同的结果。这不是关于@Override
这里,你要问的是 Comparator 是如何工作的。
比较器按以下顺序对 2 个对象进行排序:
- 负数,降序排列
- 零,什么都不做
- 积极的,升序排列
因此,对于优先级队列部分,当比较器对 1、4、6、3 进行排序时,它会比较数组的元素,如果差值为负,则交换它们,例如交换 1 和 4、4 和 6 等。
对于问题的第一部分,您正在使用此实现:
(n2[0] == n1[0])? n1[1] - n2[1]: n2[0] - n1[0]
对于 2 大小的整数数组,您正在比较数组,如下所示。
- 如果每个数组的第一个元素不相等,则您尝试按降序排序(即,将 [7, 0] 放在 [4, 4] 之前)
- 如果每个数组的第一个元素相等,则您尝试按升序排序(即,将 [7,0] 置于 [7,1] 之前)。
推荐阅读
- node.js - (节点:17891)UnhandledPromiseRejectionWarning:TypeError:newPay.save 不是函数
- dynamics-crm - 字段是可选的,但它在门户上显示为必填项
- react-native - 反应原生 Flatlist 导航到不同的页面
- c# - 错误:启动 Windows 服务时出现“[SC] StartService FAILED 1053”
- parsing - Dart2 语法无法识别集合文字
- rxjs - forkjoin 和 combineLatest rxjs 的区别
- python - 如何使参数为变量赋值?
- sql - DB2 z/OS 触发器中的非法符号 DECLARE
- javascript - 限制输入的最大允许长度元素
- python - 如何仅使用 tensorflow 操作附加 1 级张量?