2009-11-27 5 views

Antwort

5

Ich denke, die Antwort auf "muss ich ein neues Objekt erstellen, um eine Scala-Eigenschaft zu mischen?" ist ja". Sie können den Schmerz einiger mit umhüllenden Objekten und impliziten Konvertierungen minimieren.


Für Ihr spezielles Problem, ich war nicht in der Lage groupBy (...) zu zwingen, eine veränderbare Karte zu wandelbar Sätzen zurück, die Sie sie wickeln mit „MapProxy mit MultiMap“ brauchen würden. Aber es ist nicht zu viele Zeilen Code Ihre eigene Version von "groupBy" umzusetzen:

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

} 

Nachtrag

Hier ist ein Beispiel für Umwickeln eines vorhandenen Map [String, Set [Int]] in ein MultiMap, ohne die Werte zu kopieren:

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)) 
} 

Beachten Sie, dass dies nicht auf das Ergebnis der groupBy (...), weil die Samen Karte erforderlich ist, durchgeführt werden b e mutable und groupBy (...) gibt eine unveränderliche Map zurück.

+0

Beim Aufruf von groupBy() und einer änderbaren Auflistung wird eine mutable.Map zurückgegeben. –

+0

Können Sie demonstrieren, dass GroupBy eine veränderbare Map zurückgibt? Ich erhalte einen Compilerfehler wie hier gezeigt (http://gist.github.com/245062). –

+0

Ich denke, es gibt eine unveränderliche Karte von veränderbaren Mengen zurück? Egal, ich möchte keine Karte, ich möchte eine Multimap. –

Verwandte Themen