In Scala, chiamando groupBy()
su una raccolta viene restituito un Map
dove i valori sono raccolte, ma voglio un MultiMap
. Qual è il modo più semplice per fare la conversione? Posso evitare di creare un nuovo MultiMap
e copiare tutto?Devo creare un nuovo oggetto da mixare in un tratto Scala?
6
A
risposta
5
Penso che la risposta a "Devo creare un nuovo oggetto da mixare in un tratto Scala?" è sì". Puoi minimizzare il dolore con oggetti avvolgenti e conversioni implicite.
Per il vostro problema specifico, sono stato in grado di costringere groupBy (...) per restituire una mappa mutevole agli insiemi mutevoli, che si avrebbe bisogno di avvolgerlo con "MapProxy con MultiMap". Ma, non è troppo molte righe di codice per implementare la propria versione di "groupBy":
package blevins.example
object App extends Application {
implicit def multiMapable[B](c: Iterable[B]) = new {
def groupByMM[A](f: B => A) = {
import scala.collection.mutable._
val ret = new HashMap[A,Set[B]] with MultiMap[A,B]
for (e <- c) { ret.addBinding(f(e), e) }
ret
}
}
val c = List(1,2,3,4,5,6,7,8,9)
val mm = c.groupByMM { i => if (i < 5) "alpha" else "beta" }
mm.addBinding("alpha",12)
println(mm) // Map(beta -> Set(5, 7, 6, 9, 8), alpha -> Set(3, 1, 4, 2, 12))
}
Addendum
Ecco un esempio di avvolgere una mappa esistente [String, Set [Int]] in un MultiMap senza copiare i valori:
object App extends Application {
import scala.collection.mutable._
val seed: Map[String,Set[Int]] = Map("even" -> Set(2,4,6), "odd" -> Set(1,3,5))
val multiMap = new MapProxy[String,Set[Int]] with MultiMap[String,Int] {
val self = seed
}
multiMap.addBinding("even", 8)
println(multiMap) // Map(odd -> Set(5, 3, 1), even -> Set(6, 8, 4, 2))
}
si noti che questo non può essere fatto sul risultato di groupBy (...) perché la mappa seme è tenuto a b e mutabile e groupBy (...) restituisce una mappa immutabile.
Chiamando groupBy() e una collezione mutabile restituisce un mutable.Map. –
Puoi dimostrare groupBy restituendo una mappa mutabile? Ottengo un errore del compilatore come mostrato qui (http://gist.github.com/245062). –
Immagino che restituisca una mappa immutabile di set mutabili? Indipendentemente da ciò, non voglio affatto una mappa, voglio un multimap. –