-1

假设我已经有一个 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}

我现在想将它存储在每个网格中,并且将有一种方法在以后的步骤中从该列表中删除,因为我正在取消该网格中的这些可能性。并且 data{} 中的数据不必显示给用户。

4

3 回答 3

1

我希望这会在某种程度上清楚

在内部,Java 将二维数组存储为数组数组:假设您有

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
于 2013-10-24T16:57:20.207 回答
0

是的,有可能。为此,我建议使用boolean[][][]where,例如,theArray[6][3][8]一个布尔值,指示数字 8 是否包含在第 6 行第 3 列的单元格中。

于 2013-10-24T16:59:02.263 回答
0

只需使用 boolean[] 进行可能的选择。您可以使用 Set ( http://docs.oracle.com/javase/7/docs/api/java/util/Set.html ),但对于只有布尔选项的固定大小的小型池,Set 是一种过度杀伤力 (主要是由于代码开销)。

接下来的事情是,OOP(Java 是,或者至少应该是 OOP)的基本原则是,您应该根据其功能将数据分组到对象/类中。如果您尝试聚合网格中的单元格,您应该创建一个网格(二维数组)objects,而不是几个 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;
于 2013-10-24T17:04:06.020 回答