In Scala ruft groupBy()
für eine Sammlung eine Map
zurück, wo die Werte Sammlungen sind, aber ich möchte ein MultiMap
. Was ist der einfachste Weg, die Konvertierung durchzuführen? Kann ich es vermeiden, einen neuen MultiMap
zu erstellen und alles zu kopieren?Muss ich ein neues Objekt erstellen, um eine Scala-Eigenschaft zu mischen?
Antwort
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.
- 1. Automapper: Eigenschaftswerte aktualisieren, ohne ein neues Objekt zu erstellen
- 2. Wie übersetze ich ein JavaScript-Objekt in ein neues Objekt?
- 3. Gibt es eine Möglichkeit, einem SimpleDateFormat-Objekt Sekunden hinzuzufügen, ohne ein neues Objekt zu erstellen?
- 4. XmlReader - Ich muss ein Element bearbeiten und ein neues erzeugen
- 5. Sparql Abfrage, um ein neues Diagramm zu erstellen
- 6. Muss ich eine Fabrik verwenden, um ein einfaches Objekt in Jersey zu injizieren?
- 7. Warum "Fallklasse" braucht nicht "neu", um ein neues Objekt zu erstellen
- 8. Wie kombiniere ich moment.js timezone mit toDate, um ein neues Datumsobjekt zu erstellen?
- 9. Wie kann ich ein neues Zahlenanzeigeformat erstellen?
- 10. Erstellen Sie ein neues PropertyInfo-Objekt im laufenden Betrieb
- 11. Muss ich eine Instanz von Long erstellen, um ein Long als Parameter zu senden?
- 12. Was muss ich wissen, um Xcode-Projektvorlagen zu erstellen?
- 13. Symfony neues Objekt erstellen viele zu einem Fehleraufruf undefined Methode
- 14. erstellen neues Objekt aus Array javascript
- 15. Erstellen Sie ein neues PHP-Objekt in einer vorhandenen Klasse
- 16. ‚invocables‘ muss ein Objekt
- 17. Java-Postfix-Inkrement-Operator (i ++) ein neues Objekt erstellen
- 18. Wenn ich ein Objective-C-Objekt überbrückte, muss ich etwas Besonderes tun, um Speicherlecks zu vermeiden?
- 19. Gibt es eine Möglichkeit, ein Repository als "Vorlage" zu verwenden, um ein neues Repository zu starten?
- 20. Muss ich ein zurückgegebenes NSError-Objekt freigeben?
- 21. So erstellen Sie ein neues RealmObject, das eine RealmList enthält
- 22. jquery ein neues Objekt erstellen und HTML-Text einfügen
- 23. Erstellen Sie ein neues List-Objekt in Python
- 24. Wo sollte ich Änderungen in meiner iPhone-Ansicht speichern, um ein Objekt neu zu erstellen?
- 25. Erstellen Sie ein neues Array
- 26. Wie füge ich ein neues Objekt zu einer Liste ohne eine Variable hinzu?
- 27. java verwenden, um ein neues Verzeichnis und eine Datei darin zu erstellen
- 28. Verwenden Sie eine ObjectCollection als Parameter, um ein neues Steuerelement zu erstellen?
- 29. Wie zeichne ich Text über einem UIImage, um ein neues Image zu erstellen
- 30. LINQ: Wählen Sie ein Objekt, aber einige Eigenschaften ändern, ohne ein neues Objekt erstellen
Beim Aufruf von groupBy() und einer änderbaren Auflistung wird eine mutable.Map zurückgegeben. –
Können Sie demonstrieren, dass GroupBy eine veränderbare Map zurückgibt? Ich erhalte einen Compilerfehler wie hier gezeigt (http://gist.github.com/245062). –
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. –