Проходящий по ссылке рушит всё :( - PullRequest
0 голосов
/ 05 мая 2011

Эй, люди, у меня есть эта структура для дерева поиска

class State
{
    //CLASS STATE
    int value;
    char[][] state; //the game Grid 
    State child[]; // children of current state, maximum is 8
    State(char[][] src)
    {
        state=src;
        child=new State[8];
    }

это определение корневого узла

 State rootNode = new State(currentGrid);
 rootNode.value=-1;
 int v =maxValue(rootNode,depth);

после окончания рекурсии в функции максимального значения массив в rootNode не должен редактироваться с момента его первого состояния, но когда я его отображаю, я получаю массив, заполненный материалом, что означает, что rootNode.state передан по ссылке на функция максимального значения :(

// Я пытаюсь реализовать алгоритм MiniMax.

Ответы [ 3 ]

2 голосов
/ 05 мая 2011

Если вы не хотите, чтобы объекты, переданные в качестве параметров, были изменены, передайте копию (или сделайте копию параметра внутри метода).

Обратите внимание, что char[][] означает, что у вас есть массив массивов символов, то есть вы работаете с объектами, и если вы копируете первый уровень, у вас все равно может быть ссылка на второй.

Таким образом, вам, возможно, придется перебрать первый уровень / измерение и скопировать все массивы, как здесь:

char target[][] = new char[state.length][0];

for( int i = 0; i < state.length; ++i ) { 
  target[i] = Arrays.copyOf(state[i], state[i].length);
}
1 голос
/ 05 мая 2011

Да, Java передает ссылки на массивы, а не массив как значение. Таким образом, если вы дадите ссылку на ваше внутреннее состояние, получатель может изменить его, и изменение будет «видимым» в источнике (фактически: только один массив был изменен, и все держатели ссылок будут увидеть изменения).

Быстрое исправление / решение: клонируйте ваш массив состояний и передайте ссылку на этот клон вместо оригинала. Это сохранит ваше внутреннее корневое состояние без изменений.

1 голос
/ 05 мая 2011

Если вам нужно, вы можете легко создать копию массива через Arrays.copyOf

Вы также можете создать глубокую копию. Как это сделать, ответили здесь: Как выполнить глубокое копирование неправильного 2D-массива

...