【问题标题】:In Scala, What is the easiest way to interleave large number of iterators?在 Scala 中,交错大量迭代器的最简单方法是什么?
【发布时间】:2018-12-01 10:07:28
【问题描述】:

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

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() 破坏它作为迭代器的效率。

【问题讨论】:

    标签: scala iterator


    【解决方案1】:

    您可以创建自己的迭代器并定义 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)
    

    【讨论】:

      猜你喜欢
      • 2018-12-19
      • 1970-01-01
      • 2012-11-14
      • 2019-04-18
      • 2011-02-12
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多