二维数组操作应重构为职责分离、语义封装与模板复用:插入方法返回坐标、foreachcell抽象遍历、board类承载语义、初始化保障结构完整。

二维数组操作中重复写循环、反复判断边界、多次遍历找位置——这些不是“写得仔细”,而是代码结构出了问题。真正有效的重构,不靠堆技巧,而在于把变化点抽离、把职责拆清、把坐标和行为绑定。
把插入逻辑和定位逻辑合二为一
常见写法是先调用 putNumber(board, col, value),再遍历整个数组找 value 的位置。但值可能重复,定位不准。更直接的方式是让插入方法本身返回新元素的坐标。
- 修改方法签名:改为
int[] insertAtColumn(int[][] board, int col, int value) - 内部按列从底向上查找第一个空位(比如值为 0),填入后直接返回
new int[]{row, col} - 避免后续搜索,也规避了同值干扰问题
用函数封装通用遍历与清空动作
清空二维数组、打印棋盘、检查某列是否满——这些操作都含双重 for 循环,只是内层逻辑不同。与其复制粘贴,不如抽象出模板。
- 定义一个
forEachCell方法,接收二维数组和一个BiConsumer<integer integer></integer>操作 - 清空时传入
(i, j) -> board[i][j] = 0;打印时传入(i, j) -> System.out.print(board[i][j] + " ") - 复用同一套索引控制逻辑,减少出错概率
用对象代替裸数组承载语义
直接传 int[][] 到多个方法里,容易丢失上下文。比如“这个数组是棋盘”“那一个是缓存区”,靠注释说明不可靠。
- 封装成
Board类,内部持有一维或二维数组,提供place(int col, int value)、isEmptyAt(int row, int col)等语义化方法 - 把边界检查、越界处理、列高计算等细节收进类内,外部只关心“放”和“查”
- 后续扩展支持撤销、历史记录、状态快照,也只需在类内加字段和方法
避免为 null 做无意义防御式检查
动态创建的二维数组如 int[][] board = new int[6][],其行引用可能为 null。但若你明确每行都在使用前初始化(例如 board[i] = new int[7]),那所有 if (board[i] != null) 就是冗余噪音。
- 用构造函数或 init 方法保证数组结构完整,而非处处判空
- 必要时用
Objects.requireNonNull在入口校验一次,失败即抛异常,不掩盖问题 - 工具类如
Arrays.fill或 Stream 操作天然不接受 null 行,倒逼结构清晰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











