参照渡しするとすべてが台無しになります:(
-
29-10-2019 - |
質問
皆さん、私は検索ツリーにこの構造を持っています
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 アルゴリズムを実装しようとしています。
解決
パラメータとして渡されるオブジェクトを変更したくない場合は、コピーを渡します(またはメソッド内でパラメータのコピーを作成します)。
char[][]
は、char配列の配列があることを意味します。つまり、オブジェクトを操作していて、最初のレベルをコピーしても、2番目のレベルへの参照がある可能性があります。
したがって、次のように、最初のレベル/ディメンションをループして、そこにあるすべての配列をコピーする必要がある場合があります。 ジェネラコディセタグプレ
他のヒント
必要に応じて、次のようにして配列のコピーを簡単に作成できます。 Arrays.copyOf
ディープコピーを作成することもできます。これを行う方法はここで答えられています: 不規則な 2D 配列をディープコピーする方法
はい、Javaは値として配列ではなく配列への参照を渡します。したがって、内部状態への参照を提供すると、レシーバーはそれを変更でき、変更はソースに「表示」されます(実際、変更されたのは1つの配列とすべての参照ホルダーのみです。 変更が表示されます)。
クイックフィックス/ソリューション:状態配列のクローンを作成し、元のクローンではなくこのクローンへの参照を渡します。これにより、内部ルートの状態が変更されないままになります。