首页 > 解决方案 > 这个 @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);

这是按降序排列的。

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

标签: javaoverriding

解决方案


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

推荐阅读