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)。同じことがループでも起こります。作成lastExchangeしてから作成しますexchangeToAddForLooplastExchange後で変更されるため、リストに追加できないためです。

追加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.
}

そして私は計算する必要があり、さらにの計算e1e2加えてe

4

3 に答える 3

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);
}

次に、このコードのいずれかが何を意味するのか、また「重複ローカル変数の問題」が何を意味するのかを教えていないという問題が発生します。ああ、そしてコメントで指摘されているように、あなたのループは決して終わらない。

于 2010-12-03T11:07:47.537 に答える
3

コードについて説明しなくても、変数エラーが重複している場合は、いつでも{}を使用できます。

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

            int a=0;
            a++;


            int a=0;
            a++;

これは行います:

        {
            int a=0;
            a++;
        }
        {
            int a=0;
            a++;
        }
于 2010-12-03T11:12:49.750 に答える
2

@Jonの単純化が最も安全ですが、さらに単純化できると思います。

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());
}
于 2010-12-03T11:19:53.883 に答える