Scala如何展平嵌套的地图[字符串,任何]

Posted

技术标签:

【中文标题】Scala如何展平嵌套的地图[字符串,任何]【英文标题】:Scala How to flatten nested Map[String, Any] 【发布时间】:2017-09-02 18:36:39 【问题描述】:

我有如下嵌套地图:

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)

但是,如果我尝试将 flatten 调用为 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)

那么,我怎样才能提供隐式视图来展平上面的地图呢?

【问题讨论】:

看看这里:alvinalexander.com/scala/…我认为扁平化是错误的方法。 如果x 已经是外部地图上的键怎么办? 一开始为什么会有这种数据结构? 【参考方案1】:

你想释放关于“c”的信息有点奇怪。 但无论如何,编译器都在抱怨,因为它不知道如何将 (String,Any)、您的 Key -> Value 对转换为可遍历的,这是合乎逻辑的。 您可以向编译器提供一个提示,如果“Any”是一个 Map,它应该只使用这些值并松开键。

例如:

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' 是必需的,因为 'flatten' 返回一个 List[(String,Any)]。

【讨论】:

谢谢,这正是我需要的。

以上是关于Scala如何展平嵌套的地图[字符串,任何]的主要内容,如果未能解决你的问题,请参考以下文章

Scala 以列表为键、字符串为值的地图展平

Scala:从地图中删除任何元素并展平

如何在Scala中访问嵌套映射中的键值

Scala嵌套数组展平

scala中的“unlist”(例如展平一系列序列的序列......)

如何在 Amazon Redshift 的列中取消嵌套/展开/展平逗号分隔值?