клонирование и редактирование int[][] в java — невозможно изменить int[][]

#java #arrays #multidimensional-array #int #clone

#java #массивы #многомерный-массив #int #клонировать

Вопрос:

Это мой код:

   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 ); and maxMove( board ) , это неправильно.. Похоже nextMove , что оно остается неизменным..

Комментарии:

1. Вероятно, это означает, что ваша функция MaxMove неверна…

2. Я предлагаю вам распечатать содержимое платы nextMove, чтобы узнать, изменилось ли оно, или посмотреть на него в отладчике.

Ответ №1:

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

     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]);
        }
    }
 

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