Java中如何让数据结构持有另一数组值的引用?(数独求解器场景)
数独网格与逻辑单元自动同步的实现方案
1. 自定义可变整数包装类
Java自带的Integer是不可变类,无法实现共享引用后的自动更新,我们可以自己实现一个简单的可变int容器,让多个逻辑单元共享同一个实例:
public class MutableInt { private int value; public MutableInt(int value) { this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } }
适配你的数独结构
- 网格改为
MutableInt[][] grid = new MutableInt[9][9];,初始化时每个单元格实例化为new MutableInt(0) - SudokuRow等子类的
values数组直接引用网格对应位置的MutableInt实例:// SudokuRow构造示例 public SudokuRow(int rowIdx, MutableInt[][] grid) { this.values = new MutableInt[9]; for (int col = 0; col < 9; col++) { values[col] = grid[rowIdx][col]; } }
修改数字的逻辑
调用insertDigit时直接修改MutableInt的内部值,所有关联的逻辑单元会自动同步:
public void insertDigit(int row, int col, int digit) { grid[row][col].setValue(digit); }
2. 视图模式:按需从网格读取数据
放弃在逻辑单元中存储values数组,改为在需要数据时直接从原网格读取,彻底避免同步问题:
public class SudokuRow extends SudokuSet { private final int rowIndex; private final int[][] grid; public SudokuRow(int rowIndex, int[][] grid) { this.rowIndex = rowIndex; this.grid = grid; } // 获取单个位置的值 public int getCell(int col) { return grid[rowIndex][col]; } // 获取整行数据(按需生成) public int[] getValues() { int[] rowValues = new int[9]; System.arraycopy(grid[rowIndex], 0, rowValues, 0, 9); return rowValues; } }
这种方式无需维护任何同步逻辑,所有数据始终与原网格保持一致。数独9×9的规模极小,按需生成数组的性能开销完全可以忽略。
3. 基于NIO IntBuffer的连续单元视图
如果你的网格可以转为一维数组存储(int[] flatGrid = new int[81];,通过row*9+col定位单元格),可以用IntBuffer创建连续单元的共享视图:
// 创建某一行的共享视图 IntBuffer rowBuffer = IntBuffer.wrap(flatGrid, rowIdx*9, 9); // 创建某一宫的共享视图(比如第0宫) IntBuffer boxBuffer = IntBuffer.wrap(flatGrid, 0, 9);
但这种方法仅适合行、宫这类连续的单元,列的元素在一维数组中是非连续的,无法直接用IntBuffer创建视图,因此实用性不如前两种方案。
方案选择建议
- 习惯C++指针逻辑的话,自定义MutableInt最贴合你的需求,实现"引用式同步"
- 追求代码简洁性,视图模式是最优解,完全消除同步维护成本
内容的提问来源于stack exchange,提问作者daggerfall247
相关产品推荐
相关产品推荐

