Ich dachte über eine gute Möglichkeit nach, eine Liste von Tupeln mit doppeltem Schlüssel [("a","b"),("c","d"),("a","f")]
in eine Karte umzuwandeln ("a" -> ["b", "f"], "c" -> ["d"])
. Normalerweise (in Python) würde ich eine leere Map erstellen und die Liste for-loopen und nach doppelten Schlüsseln suchen. Aber ich bin hier auf der Suche nach einer etwas schäbigeren und klügeren Lösung.
Übrigens ist der tatsächliche Typ des Schlüsselwerts, den ich hier verwende, (Int, Node)
und ich möchte mich in eine Karte von verwandeln(Int -> NodeSeq)
Map[String, SeqView[String,Seq[_]]]
... ist das beabsichtigt?SeqView[String,Seq[_]]
ist auch einSeq[String]
. Im Nachhinein denke ich nicht, dass sich das lohnt, also habe ich das entferntview
.mapValues
wird trotzdem eine Ansicht über die Werte machen.x.groupBy(_._1).mapValues(_.map(_._2)).map(identity)
weil dermapValues
Ausdruck jedes Mal neu berechnet wird, wenn er verwendet wird. Siehe Issues.scala-lang.org/browse/SI-7005Für Googler, die sich für Duplikate interessieren:
quelle
Beginnend
Scala 2.13
werden die meisten Sammlungen mit der groupMap- Methode bereitgestellt , die (wie der Name schon sagt) einer äquivalenten (effizienteren) Methode entspricht,groupBy
gefolgt vonmapValues
:Dies:
group
s Elemente basierend auf dem ersten Teil von Tupeln (Gruppenteil von Gruppenzuordnung )map
gruppierte Werte s mit ihrem zweiten Tupel teilnimmt (Teil der Gruppe Karte Karte )Dies entspricht, wird
list.groupBy(_._1).mapValues(_.map(_._2))
jedoch in einem Durchgang durch die Liste ausgeführt.quelle
Hier ist eine Scala-idiomatischere Möglichkeit, eine Liste von Tupeln in eine Karte zu konvertieren, die doppelte Schlüssel verarbeitet. Sie möchten eine Falte verwenden.
quelle
Nachfolgend finden Sie einige Lösungen. (GroupBy, FoldLeft, Aggregate, Spark)
GroupBy-Variation
Variation links falten
Aggregierte Variation - Ähnlich wie links falten
Spark Variation - Für große Datenmengen (Konvertierung in eine RDD und in eine einfache Karte von RDD)
quelle
Sie können dies versuchen
quelle