刷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 类型的范围,导致数值溢出,从而引发错误的比较结果。
