2017-04-07 41 views
0

我有嵌套圖如下:斯卡拉如何扁平化嵌套地圖[字符串,任何]

val x: Map[String, Any] = 
    Map("a" -> "apple", "b" -> "ball", "c" -> Map("x" -> "cat", "y" -> 12)) 

,我想將其轉換成:

Map("a" -> "apple", "b" -> "ball", "x" -> "cat", "y" -> 12) 

但是,如果我嘗試調用壓扁到X然後我得到例外。

x.flatten 
Error:(40, 14) No implicit view available from (String, Any) => scala.collection.GenTraversableOnce[B]. 
println(mx.flatten) 
Error:(40, 14) not enough arguments for method flatten: (implicit asTraversable: ((String, Any)) => scala.collection.GenTraversableOnce[B])scala.collection.immutable.Iterable[B]. 
Unspecified value parameter asTraversable. 
println(x.flatten) 

那麼,如何提供隱式視圖以平坦上述地圖?

+0

看看這裏:http://alvinalexander.com/scala/how-to-combine-map-flatten-flatmap-scala-cookbook我認爲,扁平化是錯誤的做法。如果 – sascha10000

+0

'x'已經在外地圖上的關鍵? – mfirry

+1

爲什麼你擺在首位的是數據結構? – Reactormonk

回答

3

這是一個有點怪你想失去對「C」的信息。
但無論如何,編譯器是抱怨,因爲它不知道如何(字符串,任何),你的密鑰轉換 - > Value對成一筆畫,這是合乎邏輯的。
你可以提供編譯器一個暗示,以防「任何」是一個地圖,它應該只使用值和鬆散的關鍵。

例如:

x.flatten { 
    case ((key, map : Map[String, Any])) => map 
    case ((key, value)) => Map(key -> value) 
}.toMap 

這返回

Map(a -> apple, b -> ball, x -> cat, y -> 12) 

注: 'toMap',因爲 '變平' 返回列表[(字符串,任何)]是必要的。

+0

謝謝,這真的是我需要的。 –