【问题标题】:Passing by reference ruining everything :(通过引用破坏一切:(
【发布时间】:2011-05-05 10:39:25
【问题描述】:

大家好,我有这样的搜索树结构

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

【问题讨论】:

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


    【解决方案1】:

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

    请注意,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);
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • @aioobe - 克隆将执行您在克隆算法中所做的任何事情(顺便说一句 - 在他的情况下,浅拷贝可能就足够了,看起来他只是在数组中的对象周围移动,比如国际象棋人物)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-11
        • 2013-10-17
        • 2022-08-18
        • 1970-01-01
        相关资源
        最近更新 更多