Estaba pensando en una buena manera de convertir una lista de tuplas con clave duplicada [("a","b"),("c","d"),("a","f")]
en un mapa ("a" -> ["b", "f"], "c" -> ["d"])
. Normalmente (en Python), crearía un mapa vacío y for-loop sobre la lista y buscaría una clave duplicada. Pero estoy buscando una solución más inteligente y escalable aquí.
por cierto, el tipo real de clave-valor que uso aquí es (Int, Node)
y quiero convertir en un mapa de(Int -> NodeSeq)
Map[String, SeqView[String,Seq[_]]]
... ¿es intencional?SeqView[String,Seq[_]]
también es unSeq[String]
. Aún en retrospectiva, no creo que valga la pena, así que eliminé elview
.mapValues
hará una vista de todos modos en los valores.x.groupBy(_._1).mapValues(_.map(_._2)).map(identity)
porque lamapValues
expresión se volverá a calcular cada vez que se utilice. Ver issues.scala-lang.org/browse/SI-7005Para los empleados de Google que se preocupan por los duplicados:
fuente
Comenzando
Scala 2.13
, la mayoría de las colecciones se proporcionan con el método groupMap que es (como su nombre sugiere) un equivalente (más eficiente) degroupBy
seguido demapValues
:Esta:
group
s elementos basados en la primera parte de tuplas (parte de grupo del mapa de grupo )map
s valores agrupados tomando su segunda parte de tupla (parte del mapa del grupo Mapa )Esto es equivalente a,
list.groupBy(_._1).mapValues(_.map(_._2))
pero se realiza en una sola pasada por la Lista.fuente
Aquí hay una forma más idiomática de Scala para convertir una lista de tuplas en un mapa que maneja claves duplicadas. Quieres usar un pliegue.
fuente
A continuación puede encontrar algunas soluciones. (GroupBy, FoldLeft, Agregado, Spark)
Grupo por variación
Doble variación a la izquierda
Variación agregada: similar al pliegue a la izquierda
Spark Variation: para grandes conjuntos de datos (conversión a un RDD y a un mapa simple de RDD)
fuente
Puedes probar esto
fuente