0

Javaでイテレータを使用する場合、最後のイテレータは最後のノードの1つ先を指しています。そして、値はnullですよね?その後、使用する場合

iter = myList.listIterator();
sum = 0;
while (iter.hasNext()) {

sum += iter.next();

}

イテレータが指している最後の値がnullであるため、1つずつずれた問題があるべきではありませんか?実際、そのようなオフバイワンの問題はないことはわかっていますが、理由はわかりません。説明してください。前もって感謝します!

編集:申し訳ありませんが、興奮しすぎて、完全なコードを入力しませんでした。

要約:これが将来の人々に役立つことを願って、私はイテレーターをC ++のポインターとして考えていましたが、実際には、ポインターとして想像されたとしても、ノードを指すのではなく、ノード間のスペース(ノードの前のスペースはもっとprecisce)bmorris591が説明したように。

4

4 に答える 4

3

next()Iteratorに沿って移動しhasNext()、次があるかどうかを確認するだけです。Iteratorは「ポイント」しません。どちらかといえば、要素間のスペースをポイントします。

イテレータパターンを確認することをお勧めします。

于 2013-03-19T22:09:11.177 に答える
0

リストにIntegerインスタンスが含まれているとすると、次のようなことができます。

Iterator <Integer> iter = myList.listIterator();
int sum = 0;
while (iter.hasNext()) {
    sum += iter.next().intValue();
}

コードは、ループの各反復で それぞれの結果iter.next()をに追加します。sum

iter.hasNext()呼び出されると、「最初の値」ではなく、最初の値の直前になります。最初の呼び出しは、その最初の値を返し、イテレータの内部状態を2番目の値の直前(最初の値の直後)に更新します。価値)。

最後に到達すると、内部状態は最後の値の直後を指しているため、iter.hasNext()falseを返し、ループを終了します。

これで、イテレータにnull値が含まれている場合でも、への呼び出しによって値が返されnext()、NullPointerExceptionが発生します(これは単純なnullチェックで回避できます)。

于 2013-03-19T22:08:23.810 に答える
0

when returnsnullから返される要素はありません。IteratorhasNextfalse

概念的には、 がhasNext返されるfalseと、イテレータはすでに最後の要素の「過去」を指していますが、最後の要素の「過去」には何もありませんnull

nextwhen returnを呼び出すと、hasNext戻りfalseません。.nullがスローされNoSuchElementExceptionます。

于 2013-03-19T22:11:53.197 に答える
0

イテレータはリストを反復処理します。メソッド hasNext() は、反復する要素がまだ残っている場合は true を返し、すべての要素が処理された場合は false を返します。例:

内容が [0,2,4] のリスト:

iter = myList.listIterator();
iter.hasNext(); // true
iter.next(); // returns 0
iter.hasNext(); // true
iter.next(); // returns 2
iter.hasNext(); // true
iter.next(); // returns 4
iter.hasNext(); // false

したがって、オフバイワンなどの問題はありません。hasNext() が true を返すたびに、繰り返し処理する要素がまだ残っています。next() はその要素を返します。

于 2013-03-19T22:12:55.193 に答える