如何在scala中将嵌套映射[字符串,字符串]作为键和值的点分隔字符串
How to make a nested map[string,string] as dot separated strings of key and value in scala
我有一个地图[String, String]。
编辑:
val m: Map[String, Any] = Map("a" -> Map("b" -> Map("c" -> "e", "d" -> "g")))
有没有办法将我的 Map[String,Any] 转换为 Map[String,String]
将此嵌套 Map 转换为具有类似
值的另一个 Map 的最佳方法是什么
Map("a.b.c" -> "e", "a.b.d" -> "g")
我找到了适用于 Map[String,Int] 的早期解决方案。 link 在这里给出:
我尝试更改代码(在上述问题的评论中给出):
def traverse(el: String, acc: List[String] = List.empty[String]): Map[String, String] = el match {
case leaf: String => Map(acc.reverse.mkString(".") -> leaf)
case m: Map[String, String] => m flatMap {
case (k, v) => traverse(v, k :: acc)
}
}
traverse(m)
但是,我收到以下错误:
Scrutinee 与模式类型不兼容,发现:Map[String, String],需要:String
我是 Scala 的新手,所以无法修改代码,请指出是什么原因造成的。
更新解决方案:
def unravel(badmap :Map[String,_]
,key:List[String] = Nil) :Map[String,String] =
badmap.foldLeft(Map.empty[String,String]){
case (m,(k,v)) if v.isInstanceOf[Map[_,_]] =>
println("Case1" + m)
m ++ unravel(v.asInstanceOf[Map[String,_]], k::key)
case (m,(k,v)) =>
println("Case2: " + m)
val tempv = if (v!=null) v.toString else null
m + ((k::key).reverse.mkString(".") -> tempv )
}
我有一个空值导致失败。我更新了给出的解决方案。谢谢!
你处境不佳(输入Any
)。
有时我们不得不使用不明智和不安全的工具(运行时类型转换)来摆脱困境。
def unravel(badmap :Map[String,_]
,key:List[String] = Nil) :Map[String,String] =
badmap.foldLeft(Map.empty[String,String]){
case (m,(k,v)) if v.isInstanceOf[Map[_,_]] =>
m ++ unravel(v.asInstanceOf[Map[String,_]], k::key)
case (m,(k,v)) =>
m + ((k::key).reverse.mkString(".") -> v.toString)
}
测试:
val m: Map[String, _] =
Map("a" -> Map("b" -> Map("c" -> "e", "d" -> "g")))
unravel(m)
//res0: Map[String,String] = Map(a.b.c -> e, a.b.d -> g)
最好避免这种情况。返回并修复生成 Map
.
的代码
我有一个地图[String, String]。
编辑: val m: Map[String, Any] = Map("a" -> Map("b" -> Map("c" -> "e", "d" -> "g")))
有没有办法将我的 Map[String,Any] 转换为 Map[String,String]
将此嵌套 Map 转换为具有类似
值的另一个 Map 的最佳方法是什么Map("a.b.c" -> "e", "a.b.d" -> "g")
我找到了适用于 Map[String,Int] 的早期解决方案。 link 在这里给出:
我尝试更改代码(在上述问题的评论中给出):
def traverse(el: String, acc: List[String] = List.empty[String]): Map[String, String] = el match {
case leaf: String => Map(acc.reverse.mkString(".") -> leaf)
case m: Map[String, String] => m flatMap {
case (k, v) => traverse(v, k :: acc)
}
}
traverse(m)
但是,我收到以下错误: Scrutinee 与模式类型不兼容,发现:Map[String, String],需要:String
我是 Scala 的新手,所以无法修改代码,请指出是什么原因造成的。
更新解决方案:
def unravel(badmap :Map[String,_]
,key:List[String] = Nil) :Map[String,String] =
badmap.foldLeft(Map.empty[String,String]){
case (m,(k,v)) if v.isInstanceOf[Map[_,_]] =>
println("Case1" + m)
m ++ unravel(v.asInstanceOf[Map[String,_]], k::key)
case (m,(k,v)) =>
println("Case2: " + m)
val tempv = if (v!=null) v.toString else null
m + ((k::key).reverse.mkString(".") -> tempv )
}
我有一个空值导致失败。我更新了给出的解决方案。谢谢!
你处境不佳(输入Any
)。
有时我们不得不使用不明智和不安全的工具(运行时类型转换)来摆脱困境。
def unravel(badmap :Map[String,_]
,key:List[String] = Nil) :Map[String,String] =
badmap.foldLeft(Map.empty[String,String]){
case (m,(k,v)) if v.isInstanceOf[Map[_,_]] =>
m ++ unravel(v.asInstanceOf[Map[String,_]], k::key)
case (m,(k,v)) =>
m + ((k::key).reverse.mkString(".") -> v.toString)
}
测试:
val m: Map[String, _] =
Map("a" -> Map("b" -> Map("c" -> "e", "d" -> "g")))
unravel(m)
//res0: Map[String,String] = Map(a.b.c -> e, a.b.d -> g)
最好避免这种情况。返回并修复生成 Map
.