1

からキャストしたScala Iterator(目的に応じてどちらのデータ型も快適に使用できます)がありSeqます。準備が整うまで手元に置いておきたいのですが、O(1)でサイズを取得できるようにしたいです。反復可能なオブジェクトの反復子のサイズを保持できる組み込みの設定方法があるかどうか疑問に思っていました。

4

1 に答える 1

2

余分な間接化のコストを支払うことができる場合は、別のイテレータでラップすることをお勧めします。

class SizedIterator[A](underlying: Iterator[A], val initalSize: Int) extends Iterator[A] {
  def next = underlying.next
  def hasNext = underlying.hasNext
}

その後

new SizedIterator(mySeq.iterator, mySeq.length)

ただし、マップを作成したり、新しいものを作成したりSizedIteratorすると、プレーンIteratorになってしまい、それがどれくらいの長さだったのかわからなくなることに注意してくださいinitialSize

また、イテレータがどれだけ消費されているかがわからないためinitialSize、サイズの上限もわかりませんが、使用すると何も残っていない可能性があることに注意してください。

または、次のことができます

mySeq.iterator.zipWithIndex.map{ case (x,i) => (x, mySeq.length-1) }.take(mySeq.length)

要素と残っている要素の数のペアであるを生成しIteratorます (その要素を含めて、この方法でゼロになることはありません)。

でわかる既知のサイズのものが必要な場合はO(1).lengthへのSeqキャストIterableのメソッドは、それが である場合と同じくらい速く解決されSeqます -- これがメソッドをオーバーライドする全体のポイントです -- したがって、勝ちます ' t (通常)Iterator毎回新しいものを消費します。ただし、これには.Iterableだけでなく、Iterator.

于 2013-05-05T22:16:28.610 に答える