Определенная переменная изменяет значение, если исходное значение изменяется

avatar
Jakob
9 августа 2021 в 03:25
43
1
0

У меня есть этот фрагмент кода Java

private static void move(int[] brd) {
    int[] brd_orig = brd;
    System.out.println(Arrays.toString(brd_orig)); //Print brd_orig
    for(int i = 1; i < 12; i++)
         for(int j = 1; j < 12; j++) {
             int c = brd[i];  //Swap brd[i] and brd[j]
             brd[i] = brd[j]; //Swap brd[i] and brd[j]
             brd[j] = c;      //Swap brd[i] and brd[j]
         }
    System.out.println(Arrays.toString(brd_orig)); //Print brd_orig
}

Я намерен сохранить параметр brd для последующего использования в brd_orig этой строкой int[] brd_orig = brd;.

Теперь я меняю brd, но не brd_orig внутри второго цикла for. Таким образом, мой ожидаемый результат заключается в том, что brd_orig никогда не меняет значение. Я использую отпечатки в начале и в конце, чтобы доказать это, но он ведет себя не так, как ожидалось.

Когда я запускаю функцию

move(new int[]{0, 1 ,1 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0, 2});

реальный вывод

[0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 1]

но ожидаемый вывод

[0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2]
[0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2]

Мне удалось найти ответственные линии

int c = brd[i];
brd[i] = brd[j];
brd[j] = c;

Когда я их удаляю, ошибка исчезает, но я никогда не меняю brd_orig.

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

Почему этот код работает не так, как ожидалось?

Источник
Tim Biegeleisen
9 августа 2021 в 03:27
1

Вам нужно сделать копию 2D-массива.

Jakob
9 августа 2021 в 03:32
0

@TimBiegeleisen Спасибо за ваш ответ. Какой 2D-массив вы имеете в виду? brd и brd_orig — это одномерные массивы, не так ли?

Ответы (1)

avatar
okzoomer
9 августа 2021 в 03:36
2

В Java идентификаторы массивов указывают на местоположение, а не на сами значения. Таким образом, int[] brd_orig = brd; означает "точка brd_orig, int[] в том же месте, что и brd", поэтому они являются разными идентификаторами для одного и того же массива. Вы можете использовать .clone() или System.arraycopy() для создания дубликата массива.

Jakob
9 августа 2021 в 03:37
0

Ах я вижу. Распространенная проблема с указателем. Спасибо :)