17370845950

如何在 Java 中对二维数组按多列进行排序(先按第一列、再按第二列)

本文介绍使用 java 的 `arrays.sort()` 配合 `comparator` 链式调用,对 int 类型二维数组按主次字段(如先第 0 列、再第 1 列)实现稳定升序排序的方法。

在 Java 中,对二维数组(如 int[][] arr)进行多级排序,核心在于将每一行视为一个逻辑“记录”,并借助 Comparator 定义复合比较规则。推荐方式是使用 Comparator.comparingInt(...).thenComparing(...) 实现链式比较——它先按第一列(索引 0)升序排序;当第一列值相等时,再按第二列(索引 1)升序排序,完全满足“主键优先、次键兜底”的业务需求。

以下为完整可运行示例:

import java.util.Arrays;
import java.util.Comparator;

public class MultiColumnSort {
    public static void main(String[] args) {
        int[][] arr = {
            {1, 7},
            {2, 6},
            {3, 9},
            {4, 1},
            {5, 3},
            {6, 7}
        };

        // 按第 0 列升序为主序,第 1 列升序为次序
        Arrays.sort(arr, Comparator.comparingInt(row -> row[0])
                                   .thenComparing(row -> row[1]));

        System.out.println(Arrays.deepToString(arr));
        // 输出:[[1, 7], [2, 6], [3, 9], [4, 1], [5, 3], [6, 7]]
    }
}

关键说明

  • Comparator.comparingInt(...) 显式指定了泛型类型,避免类型推断失败;
  • the

    nComparing(...) 支持任意 ToIntFunction 或 Function,此处用 row -> row[1] 即可(自动装箱为 Integer,但 thenComparingInt 更高效,推荐如下写法):
    .thenComparingInt(row -> row[1])
  • 若需降序,可组合 reversed(),例如:
    comparingInt(row -> row[0]).reversed().thenComparingInt(row -> row[1])

⚠️ 注意事项

  • 确保每行长度 ≥ 2,否则运行时抛出 ArrayIndexOutOfBoundsException;建议排序前校验数据完整性;
  • 此方法直接原地修改原数组,不创建新数组;如需保留原始顺序,请先 Arrays.copyOf();
  • 不适用于 null 行;如有空行,需在 lambda 中添加 Objects.requireNonNull(row) 或自定义空值处理逻辑。

综上,Comparator 链式调用是 Java 8+ 中简洁、安全、高性能的多字段排序方案,兼顾可读性与扩展性,是处理二维数组排序的首选实践。