Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中写入错误的类实例_Java - Fatal编程技术网

在java中写入错误的类实例

在java中写入错误的类实例,java,Java,注:此代码是Pascal Van Hentenryck在Coursera上对离散优化中的赋值的正在进行的解决方案。那些不想看到可能的解决方案或提示的人可能不想进一步阅读 我对Java相当陌生,所以这可能是一个完全错误的代码。但是我在这段代码上花了一段时间,没有任何进展。我正在逐步完成eclipse中的代码 当我逐步阅读下面的代码时,我试图更新分支[0]的实例,但是 当我更新分支[0]时,path然后这个节点。path也会更新 当我更新分支[1]时,路径然后分支[0]。路径和此节点。路径也会更新(

注:此代码是Pascal Van Hentenryck在Coursera上对离散优化中的赋值的正在进行的解决方案。那些不想看到可能的解决方案或提示的人可能不想进一步阅读

我对Java相当陌生,所以这可能是一个完全错误的代码。但是我在这段代码上花了一段时间,没有任何进展。我正在逐步完成eclipse中的代码

当我逐步阅读下面的代码时,我试图更新分支[0]的实例,但是 当我更新分支[0]时,path然后
这个节点。path
也会更新 当我更新分支[1]时,路径然后分支[0]。路径和
此节点。路径
也会更新(至少如监视窗口所示)

我做错了什么

void iterateOneStep(BnBNode thisNode, int next_path){
    BnBNode [] branch;

    branch = new BnBNode [2];

    //item not picked
    branch[0] = new BnBNode(items.size());
    branch[0].availableCapacity = thisNode.availableCapacity;
    branch[0].path = thisNode.path;
    branch[0].path[next_path] = 0;
    branch[0].val = thisNode.val;
    //item picked
    branch[1] = new BnBNode(items.size());
    branch[1].availableCapacity = thisNode.availableCapacity - items.get(next_path).weight;
    branch[1].path = thisNode.path;
    branch[1].path[next_path] = 1;
    branch[1].val = thisNode.val+items.get(next_path).value;
    ..............
BnBNode类是

public class BnBNode {
    int[] path;
    int val;
    int availableCapacity;
    int potentialVal;
    int optimum;

    BnBNode(int numItems) {
        path = new int[numItems];
        numItems--;
        while (numItems >= 0) {
            path[numItems] = -1;
            numItems--;
        }
        val = 0;
        optimum = 0;
    }
}
完整代码在

谢谢你抽出时间,
Vinay查看以下代码位:

branch[0].path = thisNode.path;
...
branch[1].path = thisNode.path;
path
的类型是
int[]
,这意味着您正在复制引用。实际上,您只有一个数组对象,在上面的代码之后,所有的
分支[0]。path
thisNode.path
分支[1]。path
引用该单个数组

您可能希望克隆阵列以创建独立副本:

branch[0].path = thisNode.path.clone();
...
branch[1].path = thisNode.path.clone();

您需要考虑元素的类型
path
。如果它不是一个基元,那么当您执行分支[0]。path=thisNode.path,您将执行分支[0]。path指向
thisNode.path
。从那以后,它们实际上是对同一对象的两个引用,您使用其中任何一个引用所做的任何更改都会影响您对另一个对象的看法。

克隆()是否与克隆的数组类型具有相同的静态类型?@user2357112:确实如此-谢谢,我忘了这一点。(JLS第10.7节适用于感兴趣的任何人。)