首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将映射[Long,Set[Long]]反转为映射[Long,Long]

将映射[Long,Set[Long]]反转为映射[Long,Long]
EN

Stack Overflow用户
提问于 2017-01-13 04:22:30
回答 4查看 103关注 0票数 1

正在尝试将Map[Long, Set[Long]]转换为Map[Long, Long]

我试过了,但有编译问题:

代码语言:javascript
运行
复制
m.map(_.swap).map(k => k._1.map((_, k._2)))

示例:

代码语言:javascript
运行
复制
Map(10 -> Set(1,2,3), 11 -> Set(4,5))

应该变成:

代码语言:javascript
运行
复制
Map(1 -> 10,
    2 -> 10,
    3 -> 10,
    4 -> 11,
    5 -> 11)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-13 06:02:40

假设in是您的Map[Long, Set[Long]]

代码语言:javascript
运行
复制
in./:(Map.empty[Long, Long]) { case (acc, (key, values)) => acc ++ values.map(_ -> key) }
票数 1
EN

Stack Overflow用户

发布于 2017-01-13 06:41:52

Map[A,B]上的flatMap将“只处理”元组的集合:

代码语言:javascript
运行
复制
m.flatMap {case (k,v) => v.map(_ -> k)} // Map[Long,Long]

从一个Map[Long,Set[Long]]到一系列的Set[(Long,Long)],它被扁平化成一个Map[Long,Long]

票数 3
EN

Stack Overflow用户

发布于 2017-01-13 04:51:41

为了澄清,看起来你有这个:

代码语言:javascript
运行
复制
Map(10 -> Set(1,2,3), 11 -> Set(4,5))

您希望将此映射转换为另一个映射,但使用的内容如下:

代码语言:javascript
运行
复制
Map(1 -> 10,
    2 -> 10,
    3 -> 10,
    4 -> 11,
    5 -> 11)

正如你所看到的,如果这些集合不是不相交的,那么结果映射中的一些关键字就会丢失:

考虑到这一点,代码将如下所示:

代码语言:javascript
运行
复制
val m: Map[Long, Set[Long]] = Map(10l -> Set(1l,2l,3l), 11l -> Set(4l,5l))

m.map(_.swap).map(k => k._1.map((_, k._2)))

val foo: Iterable[(Long, Long)] = m.flatMap { t =>
  val (key, value) = t
  value.map(_ -> key)
}

val result: Map[Long, Long] = foo.toMap
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41622291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档