这个@Override for Arrays.sort 在 Java 中如何工作?

SUV*_*N G 7 java overriding

Arrays.sort(people, (n1, n2) -> (n2[0] == n1[0])?  n1[1] - n2[1] : n2[0] - n1[0]);
Run Code Online (Sandbox Code Playgroud)

或者

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];
    }
});
Run Code Online (Sandbox Code Playgroud)

这两者都执行相同的操作。

输入: [[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);
Run Code Online (Sandbox Code Playgroud)

这是按降序排列的。

有人可以解释一下吗?如果有任何此类材料,我可以在哪里学习或阅读有关这些“覆盖”的更多信息?

Sil*_*cea 7

箭头符号是一个 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] 之前)。