どうして?そして、イテレーター項目ポインターを最初の位置に移動する最良の方法は何ですか?
どうして?
イテレータに強制的にリセットメソッドを持たせる場合everyイテレータにはリセットメソッドが必要だからです。それにより、すべてのイテレータ作成者に余分な作業が与えられます。さらに、一部のイテレーターはリセットが非常に困難(または非常に高価)であり、ユーザーにそれらのリセットを呼び出さないようにします。ファイルまたはストリームのイテレータが良い例です。
イテレータ項目のポインタを最初の位置に移動する最良の方法は何ですか?
新しいイテレータを作成します。リセットよりも高価になることはめったにありません。
ストリームを読み取った後は、ソースを再度開かずに再読み取りすることはできません。これがストリームとイテレータの仕組みです。
最善の方法は、新しいものを作成することです!
これはJCFで採用されている一般的な傾向です。機能を極端に困難にする場合を除き、インターフェイスを最小限に抑えます。これが、不変コレクション、固定サイズコレクションなどのセマンティクス用の個別のインターフェイスを持たない理由です。
(オプションとして)remove(Object)
が提供される理由-これを提供しないと、コレクションを反復処理している間にコレクションからアイテムを安全に削除することができなくなります-reset()
必須です。
繰り返しますが、別のListIterator()
(previous()
やpreviousIndex()
のようなメソッドを提供する)が存在する理由-List
インターフェースでは、主な機能は使用されているのは、インデックスを使用して要素をレイアウトし、インデックスの順序(固定またはランダムの順序)でそれらにアクセスできる機能です。これは他のコレクションには当てはまりません。List
にこのインターフェイスを提供しないと、リストをスムーズに操作することが不可能ではないにしても、非常に困難になります。
ヒント:代わりに関数としてイテレータ変数を作成し、それを何度でも使用できます。これは、基になるロジックが繰り返し可能な場合にのみ機能します。
Scala(Javaに似ていますが、Java REPL handy)
def i = (1 to 100) iterator // i is our iterator
i.grouped(50) foreach println // prints two groups
i.grouped(50) foreach println // prints same two groups again