2009-11-27 5 views

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.

+0

Chiamando groupBy() e una collezione mutabile restituisce un mutable.Map. –

+0

Puoi dimostrare groupBy restituendo una mappa mutabile? Ottengo un errore del compilatore come mostrato qui (http://gist.github.com/245062). –

+0

Immagino che restituisca una mappa immutabile di set mutabili? Indipendentemente da ciò, non voglio affatto una mappa, voglio un multimap. –