2D数组中的多个项目

时间:2013-10-24 16:50:32

标签: java arrays arraylist

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

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

3 个答案:

答案 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;