94 votes

Convertir la liste de tuple en carte (et gérer les clés dupliquées?)

Je pensais à un bon moyen de convertir une liste de tuple avec la clé en double [("a","b"),("c","d"),("a","f")] en map ("a" -> ["b", "f"], "c" -> ["d"]) . Normalement (en python), je créerais une carte et une boucle vides sur la liste et rechercherais une clé en double. Mais je cherche quelque chose de plus scala-ish et de solution intelligente ici.

Au fait, le type actuel de valeur-clé que j'utilise ici est (Int, Node) et que je souhaite transformer en une carte de (Int -> NodeSeq)

84voto

om-nom-nom Points 33691

Groupe puis projet:

 scala> val x = List("a" -> "b", "c" -> "d", "a" -> "f")
//x: List[(java.lang.String, java.lang.String)] = List((a,b), (c,d), (a,f))
scala> x.groupBy(_._1).map { case (k,v) => (k,v.map(_._2))}
//res1: scala.collection.immutable.Map[java.lang.String,List[java.lang.String]] = Map(c -> List(d), a -> List(b, f))
 

Une manière plus évolutive d'utiliser fold, comme ci- dessous (skip map f step).

58voto

Daniel C. Sobral Points 159554

Voici une autre alternative:

 x.groupBy(_._1).mapValues(_.map(_._2))
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X