2009-11-27 9 views

Répondre

5

Je pense que la réponse à "Dois-je créer un nouvel objet pour mélanger un trait Scala?" est "Oui". Vous pouvez minimiser la douleur avec les objets d'emballage et les conversions implicites.


Pour votre problème, je ne pouvais pas exercer des pressions sur groupBy (...) pour retourner une carte mutable à des ensembles mutables, que vous auriez besoin de l'envelopper avec « MapProxy avec MultiMap ». Mais, ce n'est pas trop de lignes de code pour mettre en œuvre votre propre version de "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

Voici un exemple d'emballage une carte existante [String, Set [Int]] dans un MultiMap sans copier les valeurs:

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

Notez que cela ne peut se faire sur le résultat de groupBy (...) parce que la carte des semences est nécessaire pour b e mutable et groupBy (...) retournent une carte immuable.

+0

L'appel de groupBy() et d'une collection mutable renvoie un mutable.Map. –

+0

Pouvez-vous démontrer groupBy retournant une carte mutable? J'obtiens une erreur de compilation comme montré ici (http://gist.github.com/245062). –

+0

Je suppose qu'il renvoie une carte immuable d'ensembles mutables? Peu importe, je ne veux pas de carte du tout, je veux un multimap. –

Questions connexes