2

2D配列を別の一時配列にコピーすると、一時配列で操作を実行したときに元の配列が変更されます。

これが私の意味を示すための私のコードの一部です:

public int getPossibleMoves(int color, int turn) {
  int x = 0;
  int blankI;
  blankI = -1;
  int pBoard[][];
  pBoard = new int[board.length][board.length];
  System.arraycopy(board, 0, pBoard, 0, board.length);

  //if its the first turn and color is black, then there are four possible moves
  if(turn == 0 && color == BLACK) {       
    pBoard[0][0] = BLANK;
    current.addChild(pBoard);
    current.children.get(x).setParent(current);
    System.arraycopy(board, 0, pBoard, 0, board.length);
    x++;

    pBoard[pBoard.length-1][pBoard.length-1] = BLANK;
    current.addChild(pBoard);
    current.children.get(x).setParent(current);
    System.arraycopy(board, 0, pBoard, 0, board.length);
    x++;

    pBoard[pBoard.length/2][pBoard.length/2] = BLANK;
    current.addChild(pBoard);
    current.children.get(x).setParent(current);
    System.arraycopy(board, 0, pBoard, 0, board.length);
    x++;

    pBoard[(pBoard.length/2)-1][(pBoard.length/2)-1] = BLANK;
    current.addChild(pBoard);
    current.children.get(x).setParent(current);
    System.arraycopy(board, 0, pBoard, 0, board.length);
    x++;
  }

pBoard[0][0] = BLANK;と同様の行で、それはボードを変更するだけでなくpBoard、プログラムが正しく機能するためにボードを同じままにする必要があります。

私はこれに似た答えを見つけました。それは私がのSystem.arraycopy()代わりに使うという考えを得たところですpBoard = board。私が使用した別のプログラムで動作しますが、このSystem.arraycopy()プログラムでは動作しません。
どんな助けでも大歓迎です。

もう1つ:
これは宿題の一部です。しかし、この小さな問題を解決しても、必要な最終製品に近づくことすらできません。これはこれまでの私のコードのほんの一部ですが、先に進むにはこれを乗り越える必要があります。

4

2 に答える 2

3

ディープコピーを行う必要があります。

それ以外の:

pBoard = new int[board.length][board.length];
System.arraycopy(board, 0, pBoard, 0, board.length);

試す:

pBoard = new int[board.length][];
for ( int i = 0; i < pBoard.length; i++ ) {
  pBoard[i] = new int[board[i].length];
  System.arraycopy(board[i], 0, pBoard[i], 0, board[i].length);
}
于 2012-10-11T10:52:07.070 に答える
1

int board[][]タイプ の配列への参照の配列ですint[]System.arraycopy(board, 0, pBoard, 0, board.length)参照の配列をコピーしますが、参照された配列はコピーしません。現在、2 つの方法でアクセスできます。ディープ コピーを作成するには、参照される 1 次元配列のコピーも作成する必要があります。配列のコピーを作成するには、 を使用できることに注意してくださいarray.clone()。access でサイズ N*N の 1 次元配列を使用することも検討してくださいarray[x+N*y]

于 2012-10-11T10:46:44.460 に答える