具有已知大小的Scala迭代器/流

时间:2013-05-05 21:20:24

标签: scala stream iterator

我有一个Scala Iterator(我可以舒服地使用任何一种数据类型),我从Seq投射。我想保留它,直到我准备好它,但我也希望能够在O(1)中获得它的大小。我想知道是否有一种内置的设置方法可以让我在迭代对象上保持迭代器大小。

1 个答案:

答案 0 :(得分: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的{​​{1}}方法将尽快解决当它是Iterable时,它会有一个方法 - 这是重写方法的全部要点 - 因此每次都不会(通常)消耗一个新的Seq。但这需要您保留Iterator,而不仅仅是Iterable