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