【问题标题】:Transforming Map[String, Iterator[Int]] to Iterator[Map[String, Int]]将 Map[String, Iterator[Int]] 转换为 Iterator[Map[String, Int]]
【发布时间】:2014-03-05 20:44:36
【问题描述】:

我遇到了一些问题。我需要转换类型

Map[String, Iterator[Int]] -> Iterator[Map[String, Int]]

我目前解决这个问题的方法是使用递归函数:

def Inverter(input: Map[String, Iterator[Int]], output: Iterator[Map[String, Int]]) = {
  val inversion: Map[String, Int] = input.flatMap {case (symbol, iterator) => iterator.hasNext match {
    case true => Some((symbol,iterator.next))
    case false => None
  }}
  inversion.size match {
    case 0 => output
    case _ => Inverter(input,  output ++ Iterator(inversion))
  }
} 

这段代码解决了这个问题,但是太慢了。我认为这与++ 调用缓慢有关。有什么方法可以像我可以在恒定时间内将元素添加到迭代器的头部一样?如果没有,任何人都可以提出一个好的解决方法吗?

【问题讨论】:

    标签: scala functional-programming iterator


    【解决方案1】:
    def invert(input: Map[String, Iterator[Int]]) =
      Iterator.continually(input.collect { 
        case (key, it) if it.hasNext => (key, it.next)
      }).takeWhile(_.nonEmpty)
    

    一些解释:

    这部分:input.collect { case (key, it) if it.hasNext => (key, it.next) } 从输入映射中的每个迭代器中获取一个元素并创建一个Map[String,Int]。现在,只需在输入映射上不断应用此操作,直到我们耗尽所有迭代器。

    这有点棘手,因为迭代器本质上是可变的,而且我们依赖于 collect 调用的副作用。

    【讨论】:

    • 太好了,这正是我想要的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2013-05-24
    相关资源
    最近更新 更多