如何在scala中将嵌套映射[字符串,字符串]制作为键和值的点分隔字符串

如何在scala中将嵌套映射[字符串,字符串]制作为键和值的点分隔字符串,scala,scala-collections,Scala,Scala Collections,我有一张地图[字符串,字符串] 编辑: val m:Map[String,Any]=Mapa->Mapb->Mapc->e,d->g 有没有办法将我的Map[String,Any]转换为Map[String,String] 将此嵌套贴图转换为另一个具有以下值的贴图的最佳方法是什么 Map("a.b.c" -> "e", "a.b.d" -> "g") 我发现了一个早期的解决方案,它适用于Map[String,Int]。此处给出了链接: 我试图更改上述问题评论中给出的代码: def

我有一张地图[字符串,字符串]

编辑: val m:Map[String,Any]=Mapa->Mapb->Mapc->e,d->g

有没有办法将我的Map[String,Any]转换为Map[String,String]

将此嵌套贴图转换为另一个具有以下值的贴图的最佳方法是什么

Map("a.b.c" -> "e", "a.b.d" -> "g")
我发现了一个早期的解决方案,它适用于Map[String,Int]。此处给出了链接:

我试图更改上述问题评论中给出的代码:

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 )
}

我有一个空值导致它失败。我更新了给出的解决方案。谢谢大家!

你现在的处境很糟糕

有时我们不得不使用不明智和不安全的工具运行时类型转换来摆脱糟糕的局面

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)

最好避免这种情况。返回并修复生成该映射的代码。

案例m:Map[String,Any]是模式匹配需要保留的内容。因此,我必须将Map[String,String]更改为Map[String,Any]?示例映射打印为Mapa->Mapb->Mapc->e,d->g。我需要将其更改为a.b.c->e@jwvhi,我已经使changeMap[String,Any]闻起来像json,您可能会更好地使用更好的工具来处理此类数据类型。快速怀疑。现在,如果我的代码返回Map[String,\这个问题会更有效吗?如果是的话,你能告诉我同样的分解函数是否仍然有效吗?所以,上面我给出了一个示例图。我的实际地图是这样打印的:MapkeyA->MapkeyB->valB,keyC->keyC,keyD->MapkeyE->valE,keyF->valF,keyG->null。地图的类型是map[String,[uuu]。当我运行这个分解函数时,我得到了空指针异常。