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

不规则二维数组(也叫锯齿数组)不能按固定列数处理,遍历必须逐行检查长度,否则容易越界。核心原则是:每行独立,列索引上限由当前行决定。
通用遍历写法(推荐所有情况)
不管数组是否规则,都用以下结构——外层控行、内层控列,且列上限取 当前行的长度:
-
行循环:用
array.length控制总行数 -
列循环:每次用
array[i].length作为该行最大列索引(j ) - 避免硬编码列数,比如不用
j 或 <code>j (后者只适用于规则数组)
按列遍历不规则数组(需额外判断)
想从上到下、从左到右“一列一列”输出?不能直接套用规则数组逻辑,因为某些行可能没有第 c 列。正确做法是:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 先算出最大列数:
int maxCols = Arrays.stream(array).mapToInt(row -> row.length).max().orElse(0); - 外层循环列号
c从0到maxCols - 1 - 内层循环行号
r从0到array.length - 1,但访问前加判断:if (c
常见错误与规避方式
最容易踩坑的是变量复用和边界误判:
- 别在外部声明循环变量(如
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 <p>输出效果:1 3 4 → 2 5 → 6(每行对应一列中所有有效元素)</p>










