0

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

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 算法。

4

3 回答 3

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);
}
于 2011-05-05T10:50:37.743 回答
1

如果需要,您可以通过以下方式轻松创建数组的副本Arrays.copyOf

您还可以创建深层副本。如何做到这一点已在此处得到解答:如何深度复制不规则的二维数组

于 2011-05-05T10:45:17.630 回答
1

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

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

于 2011-05-05T10:47:15.567 回答