0

なぜこれが起こっているのか、私は少し混乱しています。答えが明らかな場合は申し訳ありませんが、私はまだJavaに慣れていません。そのため、更新するように選択した場合にのみ更新されるように
設定したと思いましたが、何らかの理由で、変更されるたびに更新されます。これがコードです。ご不明な点がございましたら、お気軽にお問い合わせください。int[] returningtemp[]

 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がtrueを表し、1がfalseを表すバイナリテーブルを生成します。trueのカウントが少なくともキャップの量である場合にのみFFAHelperメソッドを実行します(これはすべてグラフ/エッジクラスの場合です。これはグラフ/エッジクラスの従来の設定ではないことを私は知っていますが、私はこのようにすることに同意しなければなりませんでした)したがって、基本的には、truthAmountが少なくともエッジの量でなければFFAHelperに進みません。returning繰り返しになりますが、問題は、if条件を通過しなくても更新されることです。あなたの助けと時間をありがとうみんな!

4

4 に答える 4

7

returning = temp.clone();の代わりにこれを使用してreturning = tempください。を使用するreturning = tempと、temp参照値がに割り当てられreturningます。

したがって、tempを更新するたびに、returningも更新されます。

この場合、cloneメソッドを使用する場合。次に、tempのコピーを作成し、returningに割り当てます。したがって、更新しても、tempとreturningの参照値が異なるためtemp、更新されません。returning

于 2012-12-12T07:33:24.673 に答える
4
returning = temp;

基本的に、これを行うと、戻り値と一時参照の両方が同じオブジェクトを参照します

于 2012-12-12T07:30:33.160 に答える
2

あなたがするとき

returning= temp

あなたは、返す配列全体を同一視すると言っています。つまり、同じメモリ位置で戻り温度を作成します。

あなたがすべきことは

returning= temp.clone()

ある数を別の数と等しくします。そのため、戻りと一時は異なるメモリスペースを占有します

于 2012-12-12T07:35:02.373 に答える
1

戻り配列を変更したくない場合は、tempを複製し、複製した値を戻り配列に割り当てる必要があります。

この場合、プリミティブ型の配列しかないため、temp.clone()が機能します。配列に複雑なオブジェクトがある場合は、temp.clone()(デフォルトの実装)では真のディープコピーが実行されないため、配列内のすべてのオブジェクトのクローンを作成する必要があります。

于 2012-12-12T07:38:05.580 に答える