0

我有点困惑为什么会这样。如果答案很明显,我很抱歉,我对 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 方法(这都是针对图形/边类的,我知道这不是图形/边类的传统设置,但是我不得不同意这样做)所以基本上它不会继续到 FFAHelper 如果没有truthAmount 至少是边缘的数量。同样,问题是returning即使它没有通过 if 条件,它也会更新。感谢大家的帮助和时间!

4

4 回答 4

7

returning = temp.clone();用这个代替returning = temp. 如果您使用returning = temp,则temp参考值被分配给returning.

因此,每次更新 temp 时,它也会更新返回。

对于这种情况,如果您使用clone方法。然后它将创建一个 temp 的副本并分配给返回。所以即使你更新temp它也不会更新,returning因为 temp 和返回的参考值是不同的。

于 2012-12-12T07:33:24.673 回答
4
returning = temp;

基本上当你这样做时,返回和临时引用同一个对象

于 2012-12-12T07:30:33.160 回答
2

当你这样做

returning= temp

您是说将整个返回数组等同起来。即在同一内存位置返回 temp

你应该做的是

returning= temp.clone()

将一个数字与另一个数字相等。让return和temp占用不同的内存空间

于 2012-12-12T07:35:02.373 回答
1

如果您不想更改返回数组,那么您应该克隆临时并将克隆的值分配给返回数组。

在这种情况下, temp.clone() 可以工作,因为您只有原始类型的数组。如果数组中有复杂的对象,那么您应该注意克隆数组中的每个对象,因为 temp.clone() (默认实现)不会进行真正的深层复制。

于 2012-12-12T07:38:05.580 回答