Passare per riferimento rovinando tutto :(
-
29-10-2019 - |
Domanda
Ehi gente che ho questa struttura per l'albero di ricerca
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];
}
.
Questa è la definizione del nodo root
State rootNode = new State(currentGrid);
rootNode.value=-1;
int v =maxValue(rootNode,depth);
.
Dopo la fine della ricorsione nella funzione Valore MAX, l'array in rootnode non deve essere modificato dal suo primo stato ma quando la visualizzato ottengo un array riempito con cose che significa che il rootnode.state è passato per riferimento aLa funzione del valore massimo :(
// Sto cercando di implementare algoritmo minimax.
Soluzione
Se non si desidera che gli oggetti siano passati come parametri da modificare, passare in una copia (o creare una copia del parametro all'interno del metodo).
Nota che char[][]
significa che hai una serie di array di caratteri, I.e. Stai lavorando con gli oggetti e se si copia il primo livello che potresti ancora avere un riferimento al secondo.
Così potresti doverlo loop attraverso il primo livello / dimensione e copiare tutti gli array in là, come questo:
char target[][] = new char[state.length][0];
for( int i = 0; i < state.length; ++i ) {
target[i] = Arrays.copyOf(state[i], state[i].length);
}
. Altri suggerimenti
Se è necessario, è possibile creare facilmente una copia dell'array attraverso Arrays.copyOf
Puoi anche creare una copia profonda.Come fare questo è stato risposto qui: Come copiare profondo un 2D irregolareArray
Sì, Java passa referenze agli array e non all'array come valore.Quindi, se fai un riferimento al tuo stato interno lontano, il ricevitore può cambiarlo e il cambiamento è "visibile" nella sorgente (infatti: è solo uno array che è stato modificato e tutti i titolari di riferimentovedrà il cambiamento).
Quick Fix / Soluzione: clona il tuo array di stato e passare un riferimento a questo clone invece dell'originale.Questo manterrà il tuo stato di radice interno non modificato.