【问题标题】:create n iterators from one iterator从一个迭代器创建 n 个迭代器
【发布时间】:2016-07-24 06:50:05
【问题描述】:

我想使用 'duplicate' 从 scala 中的一个迭代器创建 n 个迭代器

想出了那个代码:

def getNIterators[T](it: Iterator[T], n: Int) : Seq[Iterator[T]] = {
  getNMoreIterators(Seq(it), n-1)
}

private def getNMoreIterators[T](seq: Seq[Iterator[T]], n: Int) : Seq[Iterator[T]] = {
if (n <= 0) return seq else {
  val (it1, it2) = seq.head.duplicate
  Seq(it1, it2) ++ getNMoreIterators(seq.tail, n-1)
}
}

我可以将其改进为尾递归或更有效的方法吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    您实际上是在破坏当前的Iterator 并获得 2 个新的作为回报。我认为将Iterator 销毁一次并将其放入Seq 中,从那里获取迭代器会更有效(这只是一种直觉,我没有对其进行标记)。

    def getNIterators[A](it: Iterator[A], n: Int) : Seq[Iterator[A]] = {
      val seq = it.toSeq
      Seq.fill(n)(seq.iterator)
    }
    

    您可能想在此处阅读duplicate 的问题:How to copy iterator in Scala? 和此处:How to clone an iterator?

    编辑:

    好吧,如果您不想在一开始就使用整个迭代器,请考虑使用Stream

    def getNIterators[A](it: Iterator[A], n: Int) : Seq[Iterator[A]] = {
      val seq = it.toStream
      Seq.fill(n)(seq.iterator)
    }
    

    它会根据需要消耗Iterator(除了头部,会立即消耗),所有Iterators都是独立的。

    scala> (1 to 4).iterator.map(s => {println(s); s})
    res12: Iterator[Int] = non-empty iterator
    
    scala> getNIterators(res12, 4)
    1
    res13: Seq[Iterator[Int]] = List(non-empty iterator, non-empty iterator, non-empty iterator, non-empty iterator)
    
    scala> res13.map(_.next)
    res14: Seq[Int] = List(1, 1, 1, 1)
    
    scala> res13.map(_.next)
    2
    res15: Seq[Int] = List(2, 2, 2, 2)
    
    scala> res13.map(_.next)
    3
    res16: Seq[Int] = List(3, 3, 3, 3)
    
    scala> res13.map(_.next)
    4
    res17: Seq[Int] = List(4, 4, 4, 4)
    

    【讨论】:

    • 据我了解你在做什么她实际上是在消耗迭代器,我不想这样做
    【解决方案2】:

    怎么样:

    def getNIterators[T](it: Iterator[T], n: Int) : Seq[Iterator[T]] = {
       (1 to n).map(_ => it.duplicate._2)
    }
    

    【讨论】:

    • 我认为你不能在同一个迭代器上多次调用重复
    猜你喜欢
    • 2021-10-15
    • 2018-05-20
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多