0

値を計算してリストに追加するループがあります。だから、私はそのようなことをします:

x = getValue()
values.add(x)
while (true) {
   x = getValue();
   values.add(x)
}

同じインスタンスをリストに追加したため、このアプローチが機能しないことがわかりました。詳細には、ループのすべてのサイクルで新しい値を に再割り当てxし、リストに既に追加されているすべての要素の値を変更します (最終的には同一の要素のリストを取得します)。

この問題を解決するために、次のことを行いました。

x = getValue();
Integer[] valueToAdd = new Integer[n];
for (int i=0; i<n; i++) {
   valueToAdd[i] = x[i];
}
while (true) {
   x = getValue();
   y = new Integer[n];
   for (int i=0; i<n; i++) {
      valueToAdd[i] = x[i];
   }
   values.add(valueToAdd)
}

このようにして、リストに値を追加するたびに新しいインスタンスを作成したいと考えました。しかし、ローカル変数の重複エラーが発生するため、機能しません。

ループ内で同じ変数を何度も宣言しても、このエラーが発生しないのも不思議です。この問題は、最初にループの外で新しい変数を宣言し、次にループ内でも宣言した場合にのみ発生します。

Javaで異なるインスタンスに同じ名前を再利用する方法はありますか?

追加 いくつかの問題を明確にする必要があります。すべてのコードを示したわけではありません。ループ内にbreakコマンドがあります (新しい値を生成できない場合は、ループを終了します)。xそしてタイプvalueがあります。Integer[]

ADDED 2 問題が発生する可能性があることが言及されたため、getValue()ここで詳細を説明する必要があります。getValue()実際、私のコードにはありません(getValue()例を短くするためにここで使用しました)。私のコードでは:

   Integer[] x = new x[n];
    while (true) {
       for (int i=0; i<n; i++) {
          x[i] = y[i];
       }
       values.add(x)
    }

そして、リストに同一の要素があったため、機能しませんでした(そして、すべてのサイクルのループに新しい値があるvaluesことを知っています)。x

追加 3

リストのすべての要素が同じように見えるのはなぜですか?

4

1 に答える 1

2

あなたの問題は、あなたが思っているものではありません。たとえば、次の簡単なプログラムを見てください。

String x = null;
List<String> l = new ArrayList<String>();
for (int i = 0; i < 10; i ++) {
    x = String.valueOf(i);
    l.add(x);
}

System.out.println(l);

0 から 9 までの数字を出力します。これは、Java が値渡しであるためです (ここを確認してください)。addx への参照を渡すのではなく、(メソッド内で) x の値を渡します。

したがって、問題はgetValue()同じオブジェクトを返すメソッドにあります。

更新:質問がより理にかなっています。x毎回同じオブジェクトを操作していて、その状態を変更しているだけです。異なる値を入れるには、宣言をループ内に移動します。

while (true) {
   Integer[] x = new x[n];
   ...
}

ループの外側で必要な場合は、そこで別の変数を使用してください。名前を付ける必要はありませんx。とにかくループ内で使用しないためです。

于 2010-12-03T09:26:54.347 に答える