刷leetcode的过程中又用到了Arrays.sort()中的自定义排序器,之前只在写业务的时候用过,总是gpt总是忘,总结一下。
自定义排序器可以使用lambda表达式来编写,参数 (a, b) -> { ... }
的具体含义:
(a, b)
是两个待比较的元素:a
和b
是people
数组中的两个元素,用来进行排序的比较操作。假设people
是int[][]
类型(二维数组),则a
和b
也是int[]
类型的数组。- 排序逻辑:
if (a[0] == b[0]) return a[1] - b[1];
- 如果
a[0]
和b[0]
相等,则通过a[1] - b[1]
的值决定顺序。 - 这里
a[1] - b[1]
表示升序排序,因为a[1]
小于b[1]
时返回负值,则a
会排在b
之前。
- 如果
return b[0] - a[0];
- 如果
a[0]
不等于b[0]
,则使用b[0] - a[0]
进行比较。 b[0] - a[0]
表示降序排序,因为b[0]
大于a[0]
时返回正值,所以b
会排在a
之前。
- 如果
其实乍一看还是很懵的,解释一下为什么 a[1] - b[1]
和 b[0] - a[0]
分别表示升降序:
Java 的 Comparator
约定:比较两个元素时,如果返回值为负,表示第一个元素应该排在第二个元素之前;返回值为正,表示第一个元素排在后面。
对于升序:
- 当
a[1] < b[1]
时,a[1] - b[1]
为负,表示a
应排在b
前,符合升序。 - 当
a[1] > b[1]
时,a[1] - b[1]
为正,表示b
应排在a
前,这也符合升序。
对于降序:
- 若
a[1] < b[1]
,则b[1] - a[1]
为正,表示b
应排在a
前(降序)。 - 若
a[1] > b[1]
,则b[1] - a[1]
为负,表示a
应排在b
前。
另外,升序排列的语句(a, b) -> Integer.compare(a[0], b[0]) 等价于 (a, b) -> {return a[0] – b[0];},降序排列语句调换两个元素位置即可。
使用Integer.compare更好的原因是,代码的简洁性和潜在的数值溢出处理。例如 a[0]
和 b[0]
的值非常大(接近 Integer.MAX_VALUE
),a[0] - b[0]
可能会超出 int
类型的范围,导致数值溢出,从而引发错误的比较结果。