【问题标题】:How to convert Map[Map[String,Int],Int] into Map[String,Int] in scala?如何在 Scala 中将 Map[Map[String,Int],Int] 转换为 Map[String,Int]?
【发布时间】:2019-01-24 05:28:58
【问题描述】:

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

例如:

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

要求的结果:

resultMap = Map("a"->2)

【问题讨论】:

  • 考虑:Map(Map("a"->1)->11,Map("a"->2)->22) 结果应该是"a"->11 还是"a"->22
  • 是的,@jwvh 询问了,如果我们有 Map(Map("a" -> 1, "b" -> 2) -> 3)) 怎么办?
  • 地图("a" -> 3 , "b" -> 3)

标签: scala


【解决方案1】:

即使你没有回答我关于重复 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-&gt;Int 会被保留,其他的会丢失。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多