假设我已经有了一个2D int value[i][j]
。这很好用,我可以在每个索引中存储一个int
。现在我想添加第二个数组int data[i][j]
,这样我就可以在其中存储多个int
数据。我接近它了吗?
例如在数独情境中:
value[0][0] = 0
但在另一个网格中,我在每个索引中都有可能的值
data[0][0] = {1,2,3,4,5,6,7,8,9}
有可能吗?如果是这样,我应该如何处理我的数据?我对阵列,多维数组,ArrayLists等感到困惑。我不确定使用哪个。
例如:
值{1,2,3},{4,5,6},{7,8,9}
在3x3中:
1,2,3
4,5,6
7,8,9
数据{1,2,3,4,5,6,7,8,9}
我想将它现在存储在每个网格中,并且有一个方法可以在后续步骤中从该列表中删除,因为我正在取消该网格中的那些可能性。数据{}中的数据不必向用户显示。
答案 0 :(得分:1)
我希望这会在某种程度上明确
在内部,Java将2维数组存储为数组数组: 假设你有
int [][] nums = new int[5][4];
以上内容实际上相当于一个3个步骤:
int [][] nums;
// create the array of references
nums = new int[5][];
// this create the second level of arrays
for (int i=0; i < nums.length ; i++)
nums[i] = new int[4]; // create arrays of integers
答案 1 :(得分:0)
是的,有可能。为此,我建议使用boolean[][][]
,例如,theArray[6][3][8]
是一个布尔值,表示数字8是否包含在第6行第3列的单元格中。
答案 2 :(得分:0)
只需使用boolean []进行可能的选择。你可以使用Set(http://docs.oracle.com/javase/7/docs/api/java/util/Set.html),但对于只有布尔选项的固定大小的小池,Set是一种过度杀伤(主要是由于代码开销)。
接下来的事情是,OOP(和Java是,或者至少应该是OOP)的基本原则是你应该根据数据的功能将数据分组到对象/类中。如果您正在尝试在网格中聚合单元,则应创建对象的网格(2D数组),而不是几个int或boolean(或其他)阵列。
首先创建一个类,例如
class Cell {
final int POSSIBILITES = 9;
int actual_value;
boolean[] possible_values = new boolean[POSSIBILITES]; // for each number
Cell( int actual_value ) {
this.actual_value = actual_value;
for( int i = 0; i < POSSIBILITES; i++ )
possible_values[i] = true;
}
}
然后初始化/实例化一个对象数组
//...
final int X_SIZE = 9, Y_SIZE = 9;
Cell[][] cells = new Cell[X_SIZE][Y_SIZE];
for( int i = 0; i < X_SIZE; i++ )
for( int j = 0; j < Y_SIZE; j++ )
cells[i][j] = new Cell( somevalue );
//...
然后通过例如
访问它们//note: it's more proper to use getter/setter pattern, so this is only a crude example
if ( cells[3][6].actual_value = 7 )
do_something();
cells[1][2].possible_values[0] = false; // we're numbering from 0 to 8, so value 1=> index 0, 2=>1... 9=>8
cells[1][2].possible_values[4] = true;