Arrays.sort()中的自定义排序器
Arrays.sort()中的自定义排序器

Arrays.sort()中的自定义排序器

刷leetcode的过程中又用到了Arrays.sort()中的自定义排序器,之前只在写业务的时候用过,总是gpt总是忘,总结一下。

自定义排序器可以使用lambda表达式来编写,参数 (a, b) -> { ... } 的具体含义:

  1. (a, b) 是两个待比较的元素abpeople 数组中的两个元素,用来进行排序的比较操作。假设 peopleint[][] 类型(二维数组),则 ab 也是 int[] 类型的数组。
  2. 排序逻辑
    • 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 类型的范围,导致数值溢出,从而引发错误的比较结果。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注