2016-04-25 2 views
1

У меня есть назначение, где я рекурсивно модифицирую матрицу пользовательского типа. Перед рекурсией я пытаюсь сделать копию матрицы («глубокую» копию со всеми атрибутами/переменными настраиваемого типа). Однако при возврате рекурсии исходная матрица была изменена так, как если бы она была рекурсивно передана (а не копия)Java - Recursion - Матричная модификация

В приведенном ниже коде «g» изменяется после вызова «a» с помощью g2:

функциональность

Копии:

method a(Square[][]) { 
    ... 
    g2 = new Square[g.length][]; 
    for(int d = 0; d < g.length; d++) { 
     g2[d] = Arrays.copyOf(g[d], g[d].length); 
    } 
    a(g2); 
    //Here, g has been modified and not the original set of values 
} 

ответ

0

когда вы передать массив в качестве параметра, то на самом деле является точка отсчета в массив, так что, когда вы изменение параметра в методе, вы также изменение значений массив напрямую. Лучший способ избежать вашей проблемы - создать отдельный массив и перейти по значению, копируя значения исходного массива в него до того, как будет рекурсивный метод. Таким образом, у вас есть исходный массив и модифицированный массив к концу программы.

0

Arrays.copyOf() создает мелкую копию, которая означает, что любая модификация, сделанная для исходного объекта, будет отражена в созданной копии.

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

0

Arrays.copyOf не выполняет глубокую копию. Вам нужно будет реализовать это самостоятельно (и, вероятно, вообще не использовать Arrays.copyOf).

В этом ответе есть несколько предложений о том, как реализовать копирование объектов: How do I copy an object in Java? (с конструкторами копирования, являющимися главным советом).

+0

Спасибо за ответ. С конструктором копирования будет ли какой-либо из вышеперечисленного кода работать или есть необходимость сделать что-то особенное? Итак, могу ли я сделать следующее и иметь исходные значения для «g», доступные после рекурсии ?: g2 = new Square [g.length] []; для (int d = 0; d