2011-08-26 12 views

Respuesta

20

¿Puedo construir un multimap inmutable?

No con MultiMap en la biblioteca estándar de Scala. Por supuesto, puedes escribir el tuyo.

¿Cuál es la mejor manera de convertirlo a 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

estoy un poco confundido, no se asigna MultimapA-Set[B], se asigna a AB donde B puede tener muchos valores. Como quiere algo inmutable, voy a cambiar esto a Map[A, Set[B]] que no es Multimap, pero hace una de las cosas que dijo que quería.

// 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)) 
+5

También se puede usar 'mapValues', que en realidad no se producirá una nueva colección, sino que actuará como un' view' asignada en valores. –

+0

'mapValues' - agradable. Nunca he usado ese antes. Actualizado para usar eso en su lugar. –

+6

limpiador aún: 'val m = l groupBy (_._ 1) mapValues ​​(_ map {_._ 2} toSet)' –

Cuestiones relacionadas