funciones - ¿Cómo construir un multimapa de una lista de tuplas en Scala?
funciones en scala (2)
Supongamos que tengo una lista de listas de tuplas List[(A, B)]
. ¿Cuál es la mejor manera de convertirlo en un multimap
, que asigna A
al Set[B]
? ¿Puedo construir un multimap
inmutable ?
¿Puedo construir un multimap inmutable?
No con el MultiMap
en la librería estándar de Scala. Por supuesto, usted puede escribir su propio.
¿Cuál es la mejor manera de convertirlo en un multimapa?
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)}
Estoy un poco confundido, Multimap
no asigna A
al Set[B]
, asigna A
a B
donde B
puede tener muchos valores. Ya que quieres algo inmutable, voy a cambiar esto a Map[A, Set[B]]
que no es un Multimap
pero hace una de las cosas que dijiste que querías.
// 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))