Die Weitergabe von Referenzen ruiniert alles :(
-
29-10-2019 - |
Frage
Hallo Leute, ich habe diese Struktur für den Suchbaum
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];
}
Dies ist die Wurzelknotendefinition
State rootNode = new State(currentGrid);
rootNode.value=-1;
int v =maxValue(rootNode,depth);
Nach dem Ende der Rekursion in der Max-Wert-Funktion sollte das Array in rootNode nicht bearbeitet werden, da es der erste Zustand ist, aber wenn ich es anzeige, erhalte ich ein Array voller Dinge, was bedeutet, dass der rootNode.state als Verweis auf den Max-Wert übergeben wird Funktion :(
//Ich versuche, den MiniMax-Algorithmus zu implementieren.
Lösung
Wenn Sie nicht möchten, dass Objekte, die als Parameter übergeben werden, geändert werden, übergeben Sie eine Kopie (oder erstellen Sie eine Kopie des Parameters innerhalb der Methode).
Beachten Sie, dass char[][]
bedeutet, dass Sie ein Array von char-Arrays haben, d. h.Sie arbeiten mit Objekten und wenn Sie die erste Ebene kopieren, haben Sie möglicherweise immer noch einen Verweis auf die zweite.
Daher müssen Sie möglicherweise die erste Ebene/Dimension durchlaufen und alle Arrays dort kopieren, etwa so:
char target[][] = new char[state.length][0];
for( int i = 0; i < state.length; ++i ) {
target[i] = Arrays.copyOf(state[i], state[i].length);
}
Andere Tipps
Bei Bedarf können Sie ganz einfach eine Kopie des Arrays erstellen Arrays.copyOf
Sie können auch eine tiefe Kopie erstellen.Wie das geht, wurde hier beantwortet: So kopieren Sie ein unregelmäßiges 2D-Array tief
Ja, Java übergibt Verweise auf Arrays und nicht auf das Array als Wert.Wenn Sie also einen Verweis auf Ihren internen Status weggeben, kann der Empfänger ihn ändern und die Änderung ist in der Quelle "sichtbar" (tatsächlich: Es wurde nur ein Array geändert und alle Referenzinhaberwird die Änderung sehen).
Schnellkorrektur / Lösung: Klonen Sie Ihr Statusarray und übergeben Sie anstelle des Originals einen Verweis auf diesen Klon.Dadurch bleibt Ihr interner Stammstatus unverändert.