不规则二维数组按列遍历需先求最大列数maxColumn,再对每列c遍历各行r,仅当r<array.length且c<array[r].length时访问arrayr,避免越界。

Java中处理不规则二维数组(也叫锯齿数组)的遍历,核心在于每行长度独立、不能假设列数统一。直接套用规则矩阵的列优先逻辑会触发 IndexOutOfBoundsException。关键不是“怎么写循环”,而是“怎么安全地定义列边界”和“如何逐列访问存在元素的位置”。
明确不规则数组的本质
不规则数组是“数组的数组”,外层数组每个元素都是一维数组引用,各行长度可完全不同。例如:
int[][] jagged = {
{1, 2, 3},
{4, 5},
{6},
{7, 8, 9, 10}
};它没有统一的“列数”,只有最大列数(本例为4),且第1列(索引1)只在第0、1、3行存在,第2列只在第0、3行存在。
按列遍历需先确定列范围
不能用 array[0].length 代表总列数,必须扫描所有行,找出最长行的长度:
立即学习“Java免费学习笔记(深入)”;
- 遍历外层数组,记录
maxColumn = Math.max(maxColumn, row.length) - 若数组为空或某行为
null,需跳过或提前校验 - 得到
maxColumn后,外层循环列索引从0到maxColumn - 1
列内遍历时必须逐行检查边界
对每一列 c,遍历所有行 r 时,不能直接访问 array[r][c],必须先判断该行是否存在第 c 列:
- 检查
r < array.length && c < array[r].length - 仅当条件成立才读取元素,否则跳过(或填默认值如 0 / null)
- 避免把
array[r]当作非空——某些行可能初始化为null
完整安全的列优先遍历示例
以下代码可处理含 null 行、空数组、长度差异大的真实场景:
if (array == null || array.length == 0) return;
int maxColumn = 0;
for (int r = 0; r < array.length; r++) {
if (array[r] != null) {
maxColumn = Math.max(maxColumn, array[r].length);
}
}
for (int c = 0; c < maxColumn; c++) {
for (int r = 0; r < array.length; r++) {
if (array[r] != null && c < array[r].length) {
System.out.print(array[r][c] + " ");
}
}
System.out.println(); // 每列输出后换行
}输出效果对应每列所有有效元素竖向排列,缺失位置自动跳过,不报错也不填充。


















