0

演習では、ループ内でオブジェクトを別のオブジェクトに置き換える必要があります。私の解決策は、「ListIterator」を使用することです。しかし、同僚が foreach 構文を使用して参照を再生しようとしましたが、この解決策はうまくいきません。

// This doesn't work
for ( Growable growable : growables ) {
  growable = growable.grow(); // Return another object (seed -> sprout, ..)
}

// But that well
for (final ListIterator<Growable> it = growables.listIterator(); it.hasNext();) {
  it.set(it.next().grow());
}

ドキュメント[1]から、イテレータへの参照がないため、 foreach は置換に適していないことがわかります。

プログラムは、現在の要素を削除するために反復子にアクセスする必要があります。for-each ループは反復子を非表示にするため、remove を呼び出すことはできません。したがって、for-each ループはフィルタリングには使用できません。同様に、リストまたは配列をトラバースするときに要素を置き換える必要があるループには使用できません。

しかし、反復オブジェクトへの参照があります。私が間違っている ?「foreach」ソリューションが機能しない理由を誰かが説明できますか?

ありがとう

[1] http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html

4

2 に答える 2

0

最初のスニペットでは、 から要素を取得してgrowablesに割り当てgrowableます。これは、変数がその要素をgrowable 参照することを意味します。

を再割り当てgrowableすると、別のオブジェクトを参照し始めます。しかし、それは からオブジェクトを変更しませんgrowables


何が起こっているのかを理解するには、これを配列と比較できます。foreach 構文の使用:

int[] array = {1, 2, 3};
for (int x : array) {
    x = 0;
}
System.out.println(array[0]);

これは印刷されます1。その理由は、このスニペットが

int[] array = {1, 2, 3};
for (int i = 0; i < array.length; i++) {
    int x = array[i];
    x = 0;
}
System.out.println(array[0]);

xこれで、割り当て toが変更されないことがより明白になりましたarray

于 2013-07-25T10:16:49.090 に答える