Arrays.sort 通过自定义 Comparator 可实现二维数组按行排序,本质是对 int[][] 的行引用排序,每行内部顺序不变;支持按指定列升序、降序、多列组合排序,并需处理 null 和越界等边界情况。

Arrays.sort 本身不直接支持二维数组的“按行排序”,但可以通过传入自定义 Comparator 实现按某列、某规则对行进行排序。核心是把二维数组(如 int[][])看作“行对象”的一维数组,每行是一个 int[],然后比较这些行。
理解二维数组在排序中的本质
Java 中 int[][] arr 实际上是一维数组,元素类型是 int[]。所以 Arrays.sort(arr, comparator) 是在对“行引用”排序,不是对所有数字打散重排。
- 排序前后,每行内部元素顺序不变(除非你在 Comparator 里主动改)
- 改变的是“哪一行排在前面”,即行与行之间的相对位置
- 必须使用带 Comparator 的重载方法,否则会报错(默认只支持 Comparable 类型)
按首列升序排序(最常用场景)
适用于按第一列数值从小到大排列所有行:
int[][] matrix = {{3, 5}, {1, 9}, {2, 4}};
Arrays.sort(matrix, (a, b) -> Integer.compare(a[0], b[0]));
// 结果:[[1, 9], [2, 4], [3, 5]]
- 用
Integer.compare()避免整数溢出(比a[0] - b[0]更安全) - lambda 中
a和b都是int[],代表两行 - 若某行长度不足(如
a.length == 0),需加空指针/越界判断
按指定列降序 + 空值/边界防护
更健壮的写法,支持任意列索引,并处理 null 行或短行:
int colIndex = 1;
Arrays.sort(matrix, (a, b) -> {
if (a == null || b == null) return a == null ? -1 : 1;
if (a.length <= colIndex || b.length <= colIndex) {
return Integer.compare(a.length, b.length); // 短行靠前
}
return Integer.compare(b[colIndex], a[colIndex]); // 降序:b 在前
});
- 降序只需交换
a和b在 compare 中的位置 - null 行默认排在最前;也可统一抛异常或跳过(需提前过滤)
- 列越界时按行长度排序,是一种常见容错策略
按多列组合排序(如先按第0列,相等再按第1列)
类似数据库 order by col0, col1:
Arrays.sort(matrix, (a, b) -> {
int cmp0 = Integer.compare(a[0], b[0]);
if (cmp0 != 0) return cmp0;
return Integer.compare(a[1], b[1]);
});
- 先比第一列,不等就返回;相等才继续比第二列
- 可链式扩展:第三列用 else if 或嵌套三元,但建议拆成独立逻辑提升可读性
- 字符串列可用
String.compareTo(),注意 null 判断

















