2011-08-26 18 views

Odpowiedz

20

mogę zbudować niezmienny multimap?

Nie ze standardową biblioteką Scala MultiMap. Oczywiście możesz napisać własną.

Jaki jest najlepszy sposób przekonwertowania go na 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

jestem nieco zdezorientowany, Multimap nie mapuje A do Set[B], mapuje A do B gdzie B może mieć wiele wartości. Ponieważ chcesz czegoś niezmiennego, zamierzam zmienić to na Map[A, Set[B]], które nie jest Multimap, ale robi jedną z rzeczy, o których mówiłeś.

// 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

Można również użyć 'mapValues', który nie będzie faktycznie produkują nową kolekcję, ale będzie działać jako odwzorowanym' view' na wartości. –

+0

'mapValues' - nice. Nigdy wcześniej tego nie używałem. Zaktualizowany do użycia w zamian. –

+6

cleaner still: 'val m = l groupBy (_._ 1) mapValues ​​(_ map {_._ 2} toSet)' –

Powiązane problemy