如何在Scala中将元组转换为带集合的映射

如何在Scala中将元组转换为带集合的映射,scala,Scala,这是我的第一篇文章。 我想将元组转换为Scala中的Set映射,如下所示 Set((1,"a"),(2,"b"),(1,"c")) ↓ 有没有办法让它更简单 如果有任何缺少的信息,请告诉我。我建议检查Scala collection library中的所有方法,它非常广泛,通常涵盖所有像这样的常见情况 以下是您的操作方法: Set((1,"a"),(2,"b"),(1,"c")) .groupBy(_._1).mapValues(_.map(_._2)) 结果: res0: Map[In

这是我的第一篇文章。 我想将元组转换为Scala中的Set映射,如下所示

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

有没有办法让它更简单


如果有任何缺少的信息,请告诉我。

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

以下是您的操作方法:

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))
UPD:正如@OlegPyzhcov所指出的,
mapValues
创建了原始地图的惰性视图,在该视图中,每次访问时都会重新评估值。如果在创建后重复访问映射,则此操作可能效率低下。为了解决这个问题,您可能希望最终实现地图。我认为最简单的方法是:

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

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

请注意,
mapValues
是惰性的,因此它将在每个元素访问、打印等上创建一个新集。@OlegPyzhcov感谢您指出这一点。您永远不会停止学习:)了解地图是否序列化(Spark用户知道这一点!)这一点尤其重要。在Scala中(至少在2.10和2.11中)未实现材质化的映射(当您调用mapValues时)是不可序列化的,并且您的Spark作业可能会失败,但是如果您实现它们,一切都很好。
.mapValues(_.map(_._2)).map(identity)