不规则二维数组遍历必须逐行取长度,外层控行、内层控列且列上限为array[i].length;按列遍历需先求最大列数,再对每列检查array[r]非空且c<array[r].length。

不规则二维数组(也叫锯齿数组)不能按固定列数处理,遍历必须逐行检查长度,否则容易越界。核心原则是:每行独立,列索引上限由当前行决定。
通用遍历写法(推荐所有情况)
不管数组是否规则,都用以下结构——外层控行、内层控列,且列上限取 当前行的长度:
-
行循环:用
array.length控制总行数 -
列循环:每次用
array[i].length作为该行最大列索引(j < array[i].length) - 避免硬编码列数,比如不用
j < 4或j < array[0].length(后者只适用于规则数组)
按列遍历不规则数组(需额外判断)
想从上到下、从左到右“一列一列”输出?不能直接套用规则数组逻辑,因为某些行可能没有第 c 列。正确做法是:
- 先算出最大列数:
int maxCols = Arrays.stream(array).mapToInt(row -> row.length).max().orElse(0); - 外层循环列号
c从0到maxCols - 1 - 内层循环行号
r从0到array.length - 1,但访问前加判断:if (c < array[r].length) { ... }
常见错误与规避方式
最容易踩坑的是变量复用和边界误判:
- 别在外部声明循环变量(如
int r = 0),再在内外层循环里反复赋值——内层跑完后r变成行数,外层条件再用它就会越界 - 别用
array[0].length当所有行的列数,除非你确认它是规则数组 - 打印或处理前,始终检查
array != null和array[i] != null,防止空指针
实际例子:安全列遍历片段
假设数组为 {{1,2}, {3}, {4,5,6}},要按列输出:
int maxCols = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] != null) maxCols = Math.max(maxCols, array[i].length);
}
for (int c = 0; c < maxCols; 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();
}输出效果:1 3 4 → 2 5 → 6(每行对应一列中所有有效元素)


















