2014-01-29 28 views
1

嘿我有地圖這樣的:變換階內地圖

val valueParameters = Map("key1"->"value","anotherkey1"->"value","thirdkey1"->"value","key2"->"value","anotherkey2"->"value","thirdkey2"->"value") 

和圖案:

val pattern = """(?<=[a-zA-Z])\d{1,2}""".r 

val result = valueParameters.groupBy(x=>pattern.findAllIn(x._1).next().toInt).toSeq.sortBy(_._1).toMap 

其給出:Map[Int,Map[String,String],我想從第二地圖的第一字符串中刪除數我不需要再這樣我就可以:結果(1)( 「鑰匙」)不會導致(1)( 「鍵1」)

+0

看起來效率不高,但你可以做一些像'result.mapValues {case(key,value)=>('removenumberfromkeyhere',value)}' – Kigyo

+0

小心mapValues。這是一個懶惰的操作,所以這可能不是你想要的,因爲那麼每個訪問都會執行計算。見https://issues.scala-lang.org/browse/SI-4776 –

回答

3

這應該工作

val result1 = result.map { case (k,v) => 
    k -> v.map { case (a,b) => 
    val a1 = a.takeWhile(! _.isDigit) 
    a1 -> b 
    } 
} 

請注意,雖然使用mapValues會導致代碼更短,但mapValues是一種懶惰的操作,每次訪問映射時都會執行計算,而映射條目會導致計算只執行一次,這通常是您預計在斯卡拉。

+0

是的,謝謝,工作正常,是的,我不得不a.replaceAll(「\\ d」,「」),因爲將有兩位數字的條目。 – teodimoff

+0

我修改了代碼以刪除數字。但replaceAll顯然也可以。 –