2010-12-03 10 views
0
Integer[] lastExchange = new Integer[nColors]; 
Integer[] exchangeToAdd = new Integer[nColors]; 
lastExchange = getValue(); 
exchangeToAdd = getValue(); 
exchanges.add(exchangeToAdd); 

Integer[] newExchange = new Integer[nColors]; 
while (true) { 
    newExchange = getValue(lastExchange); 
    Integer[] exchangeToAddForLoop = new Integer[nColors]; 
    for (int i=0; i<nColors; i++) { 
     lastExchange[i] = newExchange[i]; 
     exchangeToAddForLoop[i] = newExchange[i]; 
    } 
    exchanges.add(exchangeToAddForLoop); 
} 

は、私はこのコードをどうしようとしています何重複するローカル変数の問題を洗練されたソリューションですか?

を追加しましたか?私はexchangesというリストを埋め込む必要があります。リストの最初の要素はlastExchangeです。コードの私の問題は、常に変数の2つの複製を作成する必要があることです(コードがエレガントではないと思う理由ですが、より良い解決策が見つけられません)。たとえば、最初はlastExchangeを作成し、次にと同じ値を持つexchangeToAddを作成します。ループでも同じことが起こります。私はlastExchangeを作成し、exchangeToAddForLoopを作成します。後者が変更されるため、lastExchangeをリストに追加できないため、これを行います。

はここ2

を追加しました私の問題です。私はそのようなコードを持っている:

Integer[] e = getValue(); 
Integer[] e1 = getValue(); // <-- I do not like that. 
exchanges.add(e1);   // <-- I do not like that. 
while (true) { 
    Integer[] e_new = getValue(e); 
    Integer[] e2 = new Integer[nColors]; // <-- I do not like that. 
    for (int i=0; i<nColors; i++) { 
     e[i] = e_new[i]; 
     e2[i] = e_new[i]; // <-- I do not like that. 
    } 
    exchanges.add(e2); // <-- I do not like that. 
} 

を、私はeの計算に加えてe1e2を計算する必要があります。

+0

何をしようとしていますか? – javamonkey79

+2

エレガント?私はそうは思わない。あなたは決して使用しないオブジェクトを不必要に作成し、ループは終了しません。 「重複ローカル変数問題」とは何ですか? – sje397

+0

おそらく関連性があります:http://stackoverflow.com/questions/4344051/why-do-i-get-a-duplicate-local-variable-error – Cephalopod

答えて

4

これは、少なくとも2つの方法で無粋コードです:あなたのローカル変数のほとんどは、その後すぐに上書きされた値

  • が割り当てられている

    • あなたnewExchange変数は、より深くネストされた宣言することができました。

    だからどんな振る舞いを変更せずに、ここではよりよいバージョンです:

    Integer[] lastExchange = getValue(); 
    Integer[] exchangeToAdd = getValue(); 
    exchanges.add(exchangeToAdd); 
    
    while (true) { 
        Integer[] newExchange = getValue(lastExchange); 
        Integer[] exchangeToAddForLoop = new Integer[nColors]; 
        for (int i=0; i<nColors; i++) { 
         lastExchange[i] = newExchange[i]; 
         exchangeToAddForLoop[i] = newExchange[i]; 
        } 
        exchanges.add(exchangeToAddForLoop); 
    } 
    

    次は、私たちは、あなたがこのコードのいずれかがやっていることを意図しているものを私たちに語っていない問題に来て、またどのようなあなたは "重複ローカル変数問題"を意味します。ああ、コメントで指摘したように、あなたのループは決して終了しません。

  • +0

    それで、コードに対する主な反論は、変数を作成するときに変数に値を代入しないことです(変数)。 'newExchange'をより深く入れ子にしたほうが良いのはなぜですか?このケースでは、すべてのサイクルで作成し割り当てますが、私の例ではすべてのサイクルで割り当てます。コードの主な問題は、私はいつも 'lastExchange'の複製を作成する必要があることです(ループの前に' exchangeToAdd'がループ内にあり、 'exchangeToAddForLoop'です)。それはコードがエレガントではないと私が考える理由です。しかし、それをよりエレガントにする方法がないかもしれません。 – Roman

    +0

    @Roman:変数の範囲を可能な限り制限すると、コードは一般的に明確になります。ループ外で使用しないことは明らかです。あなたのコードが本当にやろうとしていることを知らなければ、それを改善する方法を知ることは非常に難しいです。 –

    +0

    @Jon Skeet、ありがとうございます。私はあなたが言及した問題を理解しています(変数を宣言するときに値を代入する必要があり、ループに 'newExchange'の宣言を移す必要があります)。しかし、私の主な質問は、私が 'lastExchnage'を複製しても問題ないということでしたか?私は自分のコードが何をしようとしているのかを明らかにするために私の元の質問を拡張しました。 – Roman

    3

    あなたのコードについて議論することなく、重複する可変エラーがある場合はいつでも{}を使用できます。

    これはコンパイルされません

      int a=0; 
          a++; 
    
    
          int a=0; 
          a++; 
    

    この処理が行われますJonの簡素化@

     { 
          int a=0; 
          a++; 
         } 
         { 
          int a=0; 
          a++; 
         } 
    
    2

    は、最も安全ですが、私はそれをさらに簡素化することができると思います。

    exchanges.add(getValue()); 
    
    while (true) { // forever?? 
        // do you need null values or can you use int[] 
        int[] newExchange = getValue(exchanges.get(exchanges.size()-1); 
        // do you need to add a copy, if not then clone() can be dropped. 
        exchanges.add(newExchange.clone()); 
    } 
    
    関連する問題