2014-03-05 144 views
0

我遇到了一些問題。我需要使用遞歸函數轉換的類型將地圖[String,Iterator [Int]]轉換爲Iterator [Map [String,Int]]

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

此代碼解決了問題,但速度太慢。我認爲這與++呼叫速度緩慢有關。有什麼辦法可以將元素放在迭代器的頭部,就像我可以在List中定時一樣?如果沒有,任何人都可以想出一個很好的解決方法?

回答

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

+0

非常好,這正是我一直在尋找的!謝謝! –

相關問題