Passant par référence en ruinant tout :(
-
29-10-2019 - |
Question
Hé les gens j'ai cette structure pour l'arbre de recherche
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];
}
Ceci est la définition du nœud racine
State rootNode = new State(currentGrid);
rootNode.value=-1;
int v =maxValue(rootNode,depth);
Après la fin de la récursivité dans la fonction de valeur maximale, le tableau dans rootNode ne doit pas être modifié car c'est le premier état mais lorsque je l'affiche, je reçois un tableau rempli de choses qui signifie que rootNode.state est passé par référence à la valeur maximale fonction :(
// J'essaie d'implémenter l'algorithme minimax.
La solution
Si vous ne voulez pas d'objets qui sont passés en tant que paramètres à modifier, passez dans une copie (ou faites une copie du paramètre à l'intérieur de la méthode).
Notez que char[][]
signifie que vous avez un tableau de tableaux de char, c'est-à-dire que vous travaillez avec des objets et si vous copiez le premier niveau, vous pourriez toujours avoir une référence à la seconde.
Ainsi, vous devrez peut-être parcourir le premier niveau / dimension et y copier tous les tableaux, comme ceci:
char target[][] = new char[state.length][0];
for( int i = 0; i < state.length; ++i ) {
target[i] = Arrays.copyOf(state[i], state[i].length);
}
Autres conseils
Si vous en avez besoin, vous pouvez facilement créer une copie du tableau via Arrays.copyOf
Vous pouvez également créer une copie profonde. Comment faire cela a été répondu ici: Comment copier en profondeur un tableau 2D irrégulier
Oui, Java passe des références aux tableaux et non au tableau comme valeur. Donc, si vous faites référence à votre état interne, le récepteur peut le changer et le changement est "visible" dans la source (en fait: c'est seulement une Array qui a été modifié et tous les détenteurs de référence verront le changement).
Correction rapide / solution: clonez votre tableau d'état et transmettez une référence à ce clone au lieu de l'original. Cela gardera votre état racine interne non modifié.