在Scala中,交错大量迭代器的最简单方法是什么?

时间:2018-06-22 01:03:37

标签: scala iterator

假设我有许多迭代器具有相同的Arities:

val i1, i2, ..., in: Iterator[T]

现在我想将它们插入一个大的迭代器中:

val cc: Iterator[Seq[T]]

其中:

cc(x)(1) = Seq(i1(x), i2(x), ... in(x))

和cc.next()触发在其所有元素上调用下一个。

最简单的方法是什么?

我尝试递归地压缩它们(这会导致大量对象开销),或者使用.transpose()会破坏其作为迭代器的效率。

1 个答案:

答案 0 :(得分:2)

您可以创建自己的迭代器,并根据所需的逻辑定义nexthasNext的工作方式。假定迭代器与您指定的迭代器相同:

class MyIterator[T](iterators: List[Iterator[T]]) extends Iterator[List[T]] {
    def hasNext = iterators.headOption.map(_.hasNext).getOrElse(false)
    def next = iterators.map(_.next)
}

val iterators = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)).map(_.toIterator)
iterators: List[Iterator[Int]] = List(non-empty iterator, non-empty iterator, non-empty iterator)

val it = new MyIterator(iterators)

测试:

while(it.hasNext)
    println(it.next)

打印:

List(1, 4, 7)
List(2, 5, 8)
List(3, 6, 9)