Dans Scala, l'appel groupBy()
sur une collection renvoie un Map
où les valeurs sont des collections, mais je veux un 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?Dois-je créer un nouvel objet pour mélanger un trait Scala?
Répondre
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.
- 1. Créer un nouvel objet de classe
- 2. Réinitialiser avec un nouvel objet
- 3. Créer un nouvel objet grand Assistant: ASp.net MVC
- 4. comment créer un nouvel objet AJAX à l'aide du prototype
- 5. Impossible de créer un nouvel objet dans ActiveDirectory
- 6. classe ne me laisse pas créer un nouvel objet
- 7. jquery créer un nouvel objet et insérer le texte html
- 8. LINQ: sélectionnez un objet, mais modifier certaines propriétés sans créer un nouvel objet
- 9. Comment créer un nouvel utilisateur pour un site SharePoint?
- 10. Rails rendant un nouvel objet en édition?
- 11. Lorsque jQuery crée un nouvel objet wrapper pour les éléments?
- 12. Créer un objet à l'exécution
- 13. Dois-je créer un nouvel objet de géoprocesseur pour chaque outil de géotraitement?
- 14. Où dois-je "enregistrer" les modifications dans ma vue iPhone pour "créer un nouvel objet"?
- 15. Powershell en utilisant une expression régulière pour créer un nouvel objet de table de hachage
- 16. Besoin de savoir comment créer correctement un nouvel objet dans un autre fichier cpp
- 17. Créer un nouvel élément à la volée
- 18. Comment créer un nouvel identifiant pour le nouveau noeud ajouté?
- 19. Nouvel objet Byref. Est-il haut d'accord passe un nouvel objet comme « byref »
- 20. Créer un objet pour être attendu Json
- 21. Créer un modèle pour objet complexe
- 22. Comment définir un nouvel objet global en javascript
- 23. Comment créer un nouvel environnement Beamer avec un environnement verbatim?
- 24. Utiliser Scala Acteurs pour créer sth comme un Pipeline
- 25. Créer un nouvel enregistrement avec un PK attribué - Castle ActiveRecord
- 26. XQuery: Créer un nouvel élément avec un prénom?
- 27. Créer un objet DataSet typé (C#)
- 28. Comment créer/insérer un objet WMI?
- 29. Comment ajouter un nouvel objet avec de la mousse?
- 30. Possibilité de créer un objet Process pour un processus existant?
L'appel de groupBy() et d'une collection mutable renvoie un mutable.Map. –
Pouvez-vous démontrer groupBy retournant une carte mutable? J'obtiens une erreur de compilation comme montré ici (http://gist.github.com/245062). –
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. –