如何在Scala中使用Set将元组转换为映射

3

这是我的第一篇文章。 我想要将Scala中的元组转换为具有集合的Map,如下所示。

Set((1,"a"),(2,"b"),(1,"c"))

Map(1 -> Set("a","c"), 2 -> Set("b"))

有没有什么方法可以让它更简单易懂?

如果有任何遗漏的信息,请告诉我。

1个回答

5

我建议检查Scala集合库中的所有方法,它非常广泛,通常涵盖像这样的所有常见情况。

以下是您可以执行的操作:

Set((1,"a"),(2,"b"),(1,"c"))
  .groupBy(_._1).mapValues(_.map(_._2))

结果:

res0: Map[Int,Set[String]] = Map(2 -> Set(b), 1 -> Set(a, c))

更新:正如@OlegPyzhcov指出的那样,mapValues创建了原始映射的延迟视图,在每次访问时重新评估值。如果在创建后重复访问 map,则可能效率低下。要解决这个问题,您可能希望在最后将 map 材料化。我认为最简单的方法是按以下方式执行:

.mapValues(_.map(_._2)).map(identity)

@OlegPyzhcov如果有更简单/更有效的方法,请纠正我。


1
请注意,mapValues 是惰性的,因此它将在每个元素访问、打印等操作时创建一个新的集合。 - Oleg Pyzhcov
@OlegPyzhcov,谢谢您指出这一点。你永远不会停止学习 :) - Aivean
2
如果地图被序列化(Spark用户知道!),那么了解这一点尤为重要!在Scala中,未材料化的地图(当您调用mapValues时)是不可序列化的(至少在2.10&2.11),您的Spark作业可能会失败,而如果您材料化它们,一切都很好。 - GPI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接