Wie zwei Listen von Tupeln zusammenführen?

8

Ich habe zwei Listen in Scala, wie man sie zusammenführt, so dass die Tupel gruppiert sind?

Gibt es eine bestehende Scala-Liste API, die dies tun kann oder brauche ich es selbst tun?

Eingabe:

%Vor%

Erwartete Ausgabe:

%Vor%     
Shakti 25.10.2012, 17:30
quelle

3 Antworten

19

Sie können die folgende einzeilige versuchen:

%Vor%

Dabei sind l1 und l2 die Listen der Tupel, die Sie zusammenführen möchten.

Nun, der Zusammenbruch:

  • (l1 ++ l2) Sie verketten nur beide Listen
  • .groupBy( _._1) Sie gruppieren alle Tupel nach ihrem ersten Element. Sie erhalten eine Karte mit  das erste Element als Schlüssel und Listen von Tupeln, die mit diesem Element als Werte beginnen.
  • .map( kv => (kv._1, kv._2.map( _._2).sum ) ) Sie erstellen eine neue Map mit ähnlichen Schlüsseln, aber die Werte sind die Summe aller zweiten Elemente.
  • .toList Sie konvertieren das Ergebnis zurück in eine Liste.

Alternativ können Sie den Mustervergleich verwenden, um auf die Tupelelemente zuzugreifen.

%Vor%     
paradigmatic 25.10.2012, 17:39
quelle
3

Alternativ können Sie auch mapValues verwenden, um den Code zu verkürzen.

mapValues ermöglicht Ihnen, wie Sie wahrscheinlich erraten können, nur den Wert für jedes Paar (Schlüssel, Wert) in der Map, die von groupBy erstellt wurde, neu zuzuordnen.

In diesem Fall reduziert die an mapValues übergebene Funktion jedes (Char, Int) -Tupel auf genau den Int-Wert und summiert dann die resultierende Liste der Intents.

%Vor%

Wenn die Reihenfolge der Ausgabeliste Ihrem Beispiel folgen muss, fügen Sie einfach sorted hinzu, das auf einer impliziten Instanz von Ordering [(Char, Int)] basiert.

%Vor%     
Don Mackenzie 25.10.2012 23:55
quelle
0

Wenn Sie annehmen können, dass beide List[(A,B)] nach Ordering[A] geordnet sind, könnten Sie etwas schreiben wie:

%Vor%

Leider ist das nicht tail rekursiv.

    
Landei 26.10.2012 06:44
quelle

Tags und Links