如何在scala中将Map [Map [String,Int],Int]转换为Map [String,Int]?

时间:2019-01-24 05:28:58

标签: scala

例如。 Map[Map[String,Int],Int]我需要将其转换为Map[String,Int],即将内部映射的Int值替换为外部映射的Int值替换。

例如:

val innerMap = Map("a"->1)
val outerMap = Map(innerMap, 2)

必填结果:

resultMap = Map("a"->2)

3 个答案:

答案 0 :(得分:3)

即使您还没有回答关于重复的String值的问题,我也会猜测您想要的是这样的东西。

val mmsii :Map[Map[String,Int],Int] =
  Map(Map("a"->1)->11,Map("b"->2)->22)

mmsii.flatMap{case (m,v) => m.keys.map(_ -> v)}

或者,使用有时更友好的for理解:

for {
  (m,v) <- mmsii
  (k,_) <- m
} yield k->v

请记住,如果有重复的String键,那么将仅保留一对String->Int对,而其他将丢失。

答案 1 :(得分:0)

您可以利用此解决方案来解决问题

    val anotherMap = Map(Map("a" -> 1) -> 10, Map("b" -> 2) -> 11, Map("c" -> 3) -> 12)

    anotherMap.flatMap {
  case (keyMap, value) =>
    keyMap map {
      case (k, _) => Map(k -> value)
    }
}

// res0: scala.collection.immutable.Iterable[scala.collection.immutable.Map[String,Int]] = List(Map(a -> 10), Map(b -> 11), Map(c -> 12))

答案 2 :(得分:0)

@jwvh 的解决方案几乎相同,只是显式

val nestedMap: Map[Map[String, Int], Int] = Map(
  Map("k1" -> 1) -> 11,
  Map("k2" -> 2, "k3" -> 3) -> 22
)

val unnestedMap: Map[String, Int] = nestedMap.flatMap { (outerTuple: (Map[String, Int], Int)) =>
  val innerMap: Map[String, Int] = outerTuple._1
  val commonVal: Int = outerTuple._2
  innerMap.map { (innerTuple: (String, Int)) =>
    (innerTuple._1 -> commonVal)
  }
}
print(unnestedMap)
相关问题