клонирование и редактирование int [] [] в java - невозможно изменить int [] [] - PullRequest
4 голосов
/ 28 октября 2011

Это мой код:

  public Move makeMove(int[][] board)

(... больше кода ...)

 int[][] nextMove = board.clone(); 
  nextMove[i][j] = 1;
  int nextMaxMove = maxMove( nextMove );        

  System.out.println( next max move: " + nextMaxMove + " " + maxMove( board )  );

int[][] board - доска 8х8, и я пытаюсь вычислить лучший ход в настольной игре.

Когда я нашел список одинаково хороших ходов, я хочу проверить, какие возможности оппонента дали различные ходы, которые я могу сделать. Поэтому я clone() board, редактирую клон nextMove[i][j] = 1 и вызываю функцию maxMove на новой доске.

println для отладки, и я получаю тот же результат для maxMove( nextMove ); и maxMove( board ), это неправильно .. Кажется, что nextMove остается неизменным ..

1 Ответ

2 голосов
/ 28 октября 2011

Это происходит потому, что ваша структура данных представляет собой массив массивов, который под капотом представляет собой массив ссылок. Ваш клон является мелкой копией, поэтому клон содержит исходные массивы. Этот пример кода демонстрирует это.

    int[][] x = new int[][] { { 1,3 }, { 5,7 }  };
    int[][] copyOfX = x.clone( );
    copyOfX[1][1]=13;

    for ( int i = 0; i < 2; i++ )
    {
        System.out.println(x[i] + "/" + copyOfX[i]);
        for ( int j = 0; j < 2; j++ )
        {
            System.out.println(x[i][j] + "/" + copyOfX[i][j]);
        }
    }

Решение состоит в том, чтобы явно копировать содержимое вашего двумерного массива вместо использования .clone().

...