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

在Scala中,交错大量迭代器的最简单方法是什么?,scala,iterator,Scala,Iterator,假设我有许多具有相同算术的迭代器: val i1, i2, ..., in: Iterator[T] 现在,我想将它们交错到一个大迭代器中: val cc: Iterator[Seq[T]] 其中: cc(x)(1) = Seq(i1(x), i2(x), ... in(x)) 并且cc.next()触发对其所有元素调用的next 最简单的方法是什么 我尝试过递归地压缩它们(这会导致很高的对象开销),或者使用.transpose(),这会破坏它作为迭代器的效率。您可以创建自己的迭代器,并定

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

val i1, i2, ..., in: Iterator[T]
现在,我想将它们交错到一个大迭代器中:

val cc: Iterator[Seq[T]]
其中:

cc(x)(1) = Seq(i1(x), i2(x), ... in(x))
并且cc.next()触发对其所有元素调用的next

最简单的方法是什么


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

您可以创建自己的迭代器,并定义它的
next
hasNext
如何根据所需逻辑工作。这假设迭代器与指定的算术数相同:

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)
测试:

印刷品:

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