这是我的第一篇文章。 我想要将Scala中的元组转换为具有集合的Map,如下所示。
Set((1,"a"),(2,"b"),(1,"c"))
↓
Map(1 -> Set("a","c"), 2 -> Set("b"))
有没有什么方法可以让它更简单易懂?
如果有任何遗漏的信息,请告诉我。
这是我的第一篇文章。 我想要将Scala中的元组转换为具有集合的Map,如下所示。
Set((1,"a"),(2,"b"),(1,"c"))
↓
Map(1 -> Set("a","c"), 2 -> Set("b"))
有没有什么方法可以让它更简单易懂?
如果有任何遗漏的信息,请告诉我。
我建议检查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如果有更简单/更有效的方法,请纠正我。
mapValues
是惰性的,因此它将在每个元素访问、打印等操作时创建一个新的集合。 - Oleg Pyzhcov