-1

すでに 2D があるとしint value[i][j]ます。これはうまく機能しint、各インデックスに 1 つ格納できます。ここで、2 つ目の配列を追加して、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

0

可能な選択肢には単純に boolean[] を使用してください。Set ( http://docs.oracle.com/javase/7/docs/api/java/util/Set.html ) を使用できますが、ブール オプションのみを使用した固定サイズの小さなプールの場合、 Set はやり過ぎです (主にコードのオーバーヘッドが原因です)。

次に、OOP (および Java は OOP であるか、少なくとも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;
于 2013-10-24T17:04:06.020 に答える