我有点困惑为什么会发生这种情况。如果答案显而易见,我很抱歉,我在Java方面还很陌生。
所以我认为我已经设置了int[] returning
,因此只有在我选择更新时它才会更新,但出于某种原因,它会在每次temp[]
更改时更新。这是代码。请随意询问某些不清楚的事情,以便我能帮助您。
public int[] generateTable(Graph g, int index, int cap, int[] current, int[] edges, int count) {
int truthAmount = 0;
int result = Integer.MAX_VALUE;
int[] temp = new int[count];
int k = 0;
int[] returning = new int[count];
for(int i = 0; i < Math.pow(2, count); i++){
for(int j = count-1; j>=0; j--){
int num = (i/(int) Math.pow(2, j))%2;
temp[k] = num;
if(temp[k] == 0)
truthAmount++;
k++;
}
if(truthAmount >= cap){
result = FFAHelper(g, temp, edges);
if(result < min){
min = result;
returning = temp;
}
}
k = 0;
truthAmount = 0;
}
return returning;
}
它基本上做的是生成二进制表,其中0表示真,1表示假。它只会继续执行FFAHelper方法,如果trues的数量至少是cap的数量(这是图形/边缘类的全部,我知道它不是图形/边缘类的传统设置但是我不得不同意这样做)所以基本上它不会继续使用FFAHelper而不使用truthAmount至少是边缘量。
同样,问题是,即使它没有通过if条件,它也会更新returning
。
谢谢你们的帮助和时间!
答案 0 :(得分:7)
returning = temp.clone();
使用此代替returning = temp
。
如果您使用returning = temp
,则会将temp
参考值分配给returning
。
因此,每当您更新temp时,它也会更新返回。
对于这种情况,如果您使用clone
方法。然后它将 创建一个temp副本并分配给返回 。
因此,即使您更新temp
,它也不会更新returning
,因为临时值和返回值的参考值不同。
答案 1 :(得分:4)
returning = temp;
基本上当你这样做时,返回和临时引用相同的对象
答案 2 :(得分:2)
当你这样做时
returning= temp
你说等于整个返回的数组。即。在相同的内存位置返回临时温度
你应该做的是
returning= temp.clone()
将一个号码等同于另一个号码。因此返回和临时占用不同的内存空间
答案 3 :(得分:1)
如果您不想更改返回数组,则应克隆temp并将克隆值分配给返回数组。
在这种情况下,temp.clone()可以工作,因为你只有原始类型的数组。 如果数组中有复杂的对象,那么你应该注意克隆数组中的每个对象,因为temp.clone()(默认实现)不会执行真正的深层复制。