Comment construire un multimap à partir d'une liste de tuples dans Scala?
Supposons que j'ai une liste de tuples List[(A, B)]
. Quel est le meilleur moyen de le convertir en multimap
, qui mappe A
à Set[B]
? Puis-je construire un immuable multimap
?
21
demandé sur
Michael
2011-08-26 23:46:59
2 réponses
Puis-je construire un multimap immuable ?
Pas avec le MultiMap
dans la bibliothèque Standard Scala. Bien sûr, vous pouvez écrire votre propre.
Quel est le meilleur moyen de le convertir en multimap?
import scala.collection.mutable.{HashMap, Set, MultiMap}
def list2multimap[A, B](list: List[(A, B)]) =
list.foldLeft(new HashMap[A, Set[B]] with MultiMap[A, B]){(acc, pair) => acc.addBinding(pair._1, pair._2)}
20
répondu
Alexey Romanov
2011-08-26 20:23:01
Je suis un peu confus, Multimap
n'a pas de carte A
à Set[B]
, c'cartes A
à B
où B
peut avoir plusieurs valeurs. Puisque vous voulez quelque chose d'immuable, je vais changer cela en Map[A, Set[B]]
qui n'est pas un Multimap
mais fait l'une des choses que vous avez dit vouloir.
// This is your list of (A, B)
val l = List((1, "hi"),
(2, "there"),
(1, "what's"),
(3, "up?"))
// Group it and snip out the duplicate 'A'
// i.e. it initially is Map[A, List[(A, B)]] and we're going to convert it
// to Map[A, Set[B]]
val m = l.groupBy(e => e._1).mapValues(e => e.map(x => x._2).toSet)
println(m)
// Prints: Map(3 -> Set(up?), 1 -> Set(hi, what's), 2 -> Set(there))
15
répondu
Derek Wyatt
2011-08-26 20:15:42