我现在正在开发数独求解器,当前单元格表示为大小为 9x9 的二维数组。
int[][] grid = new int[9][9];
为了解决网格中的不同逻辑单元(行、列或框),我有子类来保存大小为 9 的数组来保存该单元中的数字
int[] values = new int[9];
最低代码:
public class SudokuSolver
{
private abstract class SudokuSet
{
int[] values; //gets initialized in constructor of subclasses
..
}
private class SudokuRow extends SudokuSet
{
SudokuRow(int position)
{
for(int i=0; i<9; i++)
values[i] = grid[position][i];
..
}
..
}
int[][] grid = new int[9][9];
SudokuSolver(int[][] g)
{
grid = g;
..
}
private void insertDigit(int x,int y,int d)
{
grid[y][x] = d;
..
}
}
我想要实现的是
values
始终与grid
的逻辑连接部分保持同步。换句话说,当我调用 insertDigit 并将一个值分配给网格中的位置时,我希望更新每个相应的值属性。所以我想让 values
保存对 grid
中数据的引用
当然,我可以跟踪插入的数字,也可以手动将其插入到每个逻辑单元中
values
,但由于每个单元格恰好出现在 3 个单元中,这会有点麻烦,而且不那么优雅。此外,这个项目的目的是学习更多来自 c/c++ 的 java,所以这是一个很好的机会来了解如何在没有实际指针的情况下实现这样的事情。
根据我的研究,这对于原始类型的数组是不可能的,因为例如当分配
values[0] = grid[5][0]
时,它实际上会复制该值。所以我并不死心地使用数组,并且我很乐意接受不同的数据结构。
我尝试使用ArrayList
我尝试过类似的事情
ArrayList<Integer> myList1 = new ArrayList<Integer>();
myList1.add(0);
myList1.add(1);
ArrayList<Integer> myList2 = new ArrayList<Integer>();
myList2.add(myList1.get(0));
myList1.set(0,5) //--> myList2.get(0) is still 0
好吧,当你这样做
myList1.set(0,5)
时,你实际上是将 myList1[0]
的内容设置为不同的对象,但是 myList2
仍然指向与之前相同的对象。您需要一个可以实际更改属性的对象,但这对于 Integer
类来说是不可能的。
class IWrapper {
public IWrapper(val: int){
value = val;
}
public value: int;
}
ArrayList<IWrapper> myList1 = new ArrayList<IWrapper>();
ArrayList<IWrapper> myList2 = new ArrayList<IWrapper>();
myList1.set(0, new IWrapper(5));
myList2.set(0, myList1.get(0));
myList1.get(0).value = 3;
System.out.println(myList2.get(0).value);
但更大的问题是,如果你想
myList1
和 myList2
保持同步,为什么不直接分配
myList2 = myList1;
这样,您对
myList1
所做的所有更改也会自动显示在 myList2
中,因为它们实际上都指向同一个对象...