【问题标题】:Scala convert map k -> (v1,v2) to single Key-value pairScala 将映射 k -> (v1,v2) 转换为单个键值对
【发布时间】:2018-10-18 08:54:06
【问题描述】:

如何执行以下操作?

将地图K1->(v1,v2), K2->(v1,v2) 转换为K1->v1,K1->v2,K2->v1,K2->V2

【问题讨论】:

  • 你试过什么?
  • 您想要 4 张地图作为答案吗?因为在同一张地图中不能有多个键。
  • @RamanMishra 是的,4 种不同的地图
  • 这些值是一个元组(一个 2-ple)还是应该代表一个集合,例如 List
  • 值是一个元组2 @jwvh

标签: scala dictionary keyvaluepair


【解决方案1】:

Map[String,(String, String)]List[Map[String,String]]

val mss = Map("s"->("a","b"), "t"->("a","c"))

mss.toList.flatMap{case (k,(a,b)) => List((k,a),(k,b))}.map(Map(_))

将每个结果元组转换为Map 的最后一步是毫无意义的。只有一个键->值对的Map 有什么用?

【讨论】:

    【解决方案2】:

    您应该首先将您的Map 转换为ListSeq(如果您想要更通用的类型),然后您可以使用flatMaptoList的例子:

    val map = Map("a" -> ("1", "2"), "b" -> ("3", "4"))
    
    map.toList.flatMap {
      case (k, (v1, v2)) => List(k -> v1, k -> v2)
    }
    // res0: List[(String, String)] = List((a,1), (a,2), (b,3), (b,4))
    

    首先将您的值映射到元组列表中,因此中间结果将是:

    List(List((a,1), (a,2)), List((b,3), (b,4)))

    然后它展平,你会得到元组列表:

    List((a,1), (a,2), (b,3), (b,4))

    【讨论】:

    • 如果我想将该列表转换为地图怎么办?如果我尝试使用 .toMap 方法,它只会得到最后一个 v 的 (k,v),我想保留它们
    • 你不能这样做,因为Map,这个数据结构只能有唯一的键。请阅读thisthis 文章
    • 如果你想保留你的值,把它们放在一个元组中。您还可以将它们存储在列表或另一个 SeqLike 数据结构中,因此您的地图可能看起来像 Map[String, Seq[String]]
    猜你喜欢
    • 2016-11-22
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2017-11-18
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多