Je réfléchissais à un bon moyen de convertir une liste de tuple avec une clé en double [("a","b"),("c","d"),("a","f")]
en en carte ("a" -> ["b", "f"], "c" -> ["d"])
. Normalement (en python), je créerais une carte vide et une boucle for sur la liste et vérifierais la clé en double. Mais je recherche quelque chose de plus scala-ish et de solution intelligente ici.
btw, le type réel de valeur-clé que j'utilise ici est (Int, Node)
et je veux devenir une carte de(Int -> NodeSeq)
Map[String, SeqView[String,Seq[_]]]
... est-ce intentionnel?SeqView[String,Seq[_]]
est également unSeq[String]
. Toujours avec le recul, je ne pense pas que cela en vaille la peine, alors j'ai supprimé le fichierview
.mapValues
fera quand même une vue sur les valeurs.x.groupBy(_._1).mapValues(_.map(_._2)).map(identity)
car l'mapValues
expression sera recalculée à chaque fois qu'elle sera utilisée. Voir issues.scala-lang.org/browse/SI-7005Pour les Googleurs qui se soucient des doublons:
la source
Au départ
Scala 2.13
, la plupart des collections sont fournies avec la méthode groupMap qui est (comme son nom l'indique) un équivalent (plus efficace) d'ungroupBy
suivi demapValues
:Ce:
group
s éléments basés sur la première partie des tuples (partie de groupe de la carte de groupe )map
s valeurs groupées en prenant leur deuxième partie de tuple (partie map du groupe Map )Ceci est un équivalent de
list.groupBy(_._1).mapValues(_.map(_._2))
mais effectué en un seul passage dans la liste.la source
Voici une manière plus idiomatique Scala de convertir une liste de tuples en une carte gérant les clés en double. Vous souhaitez utiliser un pli.
la source
Vous trouverez ci-dessous quelques solutions. (GroupBy, FoldLeft, Aggregate, Spark)
Variation GroupBy
Plier la variante gauche
Variation agrégée - Similaire au pli à gauche
Variation Spark - Pour les ensembles de données volumineux (conversion en RDD et en carte simple à partir de RDD)
la source
Vous pouvez essayer ceci
la source