通过参考破坏一切:(

时间:2011-05-05 10:39:25

标签: java pass-by-reference parameter-passing minimax

嘿,我的搜索树有这个结构

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);

在max value函数递归结束后,rootNode中的数组不应该被编辑,因为它是第一个状态但是当我显示它时我得到一个填充了东西的数组,这意味着rootNode.state通过引用传递最大值函数:(

//我正在尝试实现MiniMax算法。

3 个答案:

答案 0 :(得分:2)

如果您不希望更改作为参数传递的对象,请传入副本(或在方法内复制参数)。

请注意,char[][]表示您有一个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 :(得分:1)

如果需要,您可以通过Arrays.copyOf

轻松创建阵列的副本

您还可以创建深层副本。如何做到这一点已在这里得到解答:How to deep copy an irregular 2D array

答案 2 :(得分:1)

是的,Java将对数组的引用而不是数组作为值传递。因此,如果您提供对内部状态的引用,接收方可以更改它并且更改在源中“可见”(实际上:它只是一个数组已更改且所有引用持有者会看到变化。)

快速修复/解决方案:克隆您的状态数组并传递对此克隆的引用而不是原始克隆。这将使您的内部根状态保持不变。