将Map [String,Iterator [Int]]转换为Iterator [Map [String,Int]]

时间:2014-03-05 20:44:37

标签: scala functional-programming iterator

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

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))
  }
} 

此代码解决了问题,但速度太慢。我认为它与++调用缓慢有关。有没有什么方法可以将元素集中到Iterator的头部,就像我可以在一个列表中一样?如果没有,任何人都可以提出一个好的解决方法吗?

1 个答案:

答案 0 :(得分:2)

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调用的副作用。