2011-10-07 10 views

答えて

32

なぜですか?

あなたがリセット方法を持つようにイテレータを強制した場合、すべてのイテレータはリセットメソッドを持っている必要があるため。これはイテレータのライターに余分な作業を与えます。さらに、イテレータの中にはリセットするのが難しい(または本当に高価な)ものがあり、ユーザがリセットを呼び出すことを望まないものもあります。ファイルやストリームのイテレータは良い例です。

イテレータアイテムポインタを最初の位置に移動するにはどうすればよいでしょうか?

新しいイテレータを作成します。それはリセットよりも稀ではありません。

+6

(操作がオプションなので、*実際にはすべてのイテレータに "余分な作業"を与えない* removeメソッドがあることを除いて) – aioobe

+0

@aioobe現在のオブジェクトをイテレータは、開発者にとっては人生を本当に簡単にします。ほとんどの場合、新しいイテレータを作成することができるので、これがリセットに当てはまる場合はほとんどありません。 – DJClayworth

+1

@DJClayworth "これはすべてのイテレータライターに余分な仕事を与えます。"これは合理的な対応ではありません。図書館の作成者はもう少し努力する必要がありますが、多くの図書館利用者が利益を得るというメリットがあります。 – stackoverflowuser2010

3

新しい方法を作成することをお勧めします。

+1

まったく同じ方法(Javaの似ているが、私は便利なJavaのREPLはありません):(= iteratable.iteratorイテレータイテレータを)。 –

6

ストリームを読み終えたら、再度ソースを開くことなくストリームを読み込むことはできません。これがストリームとイテレータの仕組みです。

3

これは、JCFで採用されている一般的な傾向です。インターフェイスが最小限に抑えられます。これは、不変なコレクション、固定サイズのコレクションのようなセマンティクスのための別個のインターフェースを持たない理由です。

なぜ、remove(Object)が提供されたのですか? - これを提供しないと、安全に削除できなくなります。コレクションを繰り返しながらコレクションのアイテム - reset()を提供するものは何もありません。再び

、別個ListIterator()がある理由(previous()previousIndex()ような方法を提供) - Listインタフェースと、それが使用されている間、主な機能は、要素がインデックスをWRTレイアウトする能力である、とすることができるようにします固定順序であろうとランダムであろうと、索引順でアクセスしてください。 Listのためにこのインターフェイスを提供しないと、リストでスムーズに作業することが不可能ではないにしても非常に困難になります。

+0

ほとんどすべての 'Iteratable'と' Iterator'でできることがいくつかありますが、これは有益なことにインターフェイスに含まれていた可能性があります。有用なイテレータメソッドは 'skip' [N個の連続した移動呼び出しに相当するが、多くのイテレータは時間O(1)でそれを実装することができる]と' copyLocation' [元のものと同じアイテムを生成すると予想されるイテレータを返す]。任意のイテレータは 'skip'メソッドを実装でき、巨大ではない有限イテレータは配列に列挙し、それとそのコピーを持つことで' copyLocation'を実装できます... – supercat

+0

...その配列からアイテムを返します。クライアントコードはいずれかの操作自体を実行できますが、イテレータがクライアントコードに欠けている内部動作についての特別な知識を持っている場合は、その知識を使用して多大な速度向上を実現できます。 – supercat

2

ヒント:イテレータ変数を関数として作成してから、必要な回数だけ消費することができます。これは、基礎となるロジックが繰り返し可能な場合にのみ機能します。 Scalaでは

例あなたは以前のものを作成

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 
関連する問題