2011-08-26 1 views

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

È anche possibile utilizzare 'mapValues', che non effettivamente produrre una nuova collezione, ma fungerà da mappato' view' sui valori. –

+0

'mapValues' - bello. Non l'ho mai usato prima. Aggiornato per usarlo invece. –

+6

pulitore ancora: 'val m = l gruppoBy (_._ 1) mapValues ​​(_ mappa {_._ 2} toSet)' –