Supponiamo di avere una lista di tuple List[(A, B)]
. Qual è il modo migliore per convertirlo in un multimap
, che mappa A
a Set[B]
? Posso creare un immutabilemultimap
?Come costruire una multimap da un elenco di tuple in Scala?
21
A
risposta
20
Posso costruire un multimap immutabili?
Non con il MultiMap
nella libreria standard di Scala. Certo, puoi scrivere il tuo.
Qual è il modo migliore per convertirlo in 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)}
14
Sono un po 'confuso, Multimap
non mappa A
-Set[B]
, essa mappe A
-B
dove B
può avere molti valori. Dal momento che vuoi qualcosa di immutabile, lo cambierò in Map[A, Set[B]]
che non è uno Multimap
ma fa una delle cose che hai detto che volevi.
// 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))
È anche possibile utilizzare 'mapValues', che non effettivamente produrre una nuova collezione, ma fungerà da mappato' view' sui valori. –
'mapValues' - bello. Non l'ho mai usato prima. Aggiornato per usarlo invece. –
pulitore ancora: 'val m = l gruppoBy (_._ 1) mapValues (_ mappa {_._ 2} toSet)' –