2017-04-07 40 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

谢谢,这真的是我需要的。 –