Question

Dans Scala, l'appel de groupBy () sur une collection renvoie un Map où les valeurs sont des collections, mais je souhaite une MultiMap . Quelle est la manière la plus simple de faire la conversion? Puis-je éviter de créer un nouveau MultiMap et de tout copier?

Était-ce utile?

La solution

Je pense que la réponse à "Dois-je créer un nouvel objet à mélanger dans un trait de Scala?" est "Oui". Vous pouvez en atténuer certaines avec des objets d'habillage et des conversions implicites.

En ce qui concerne votre problème spécifique, j’ai été incapable de contraindre groupBy (...) à renvoyer une carte modifiable en ensembles mutables, qu’il serait nécessaire d’envelopper avec "MapProxy avec MultiMap". Toutefois, mettre en œuvre votre propre version de "groupBy":

ne représente pas trop de lignes de code.
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'encapsulation d'une Map existante [String, Set [Int]] dans une 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 pas être fait sur le résultat de groupBy (...) car la mappe de semences doit être modifiable et que groupBy (...) renvoie une mappe immuable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top