[FIXED] Gruppieren, mappen & reduzieren mit zwei verschiedenen Reducer-Operatoren

Ausgabe

Ich habe diese Tupel:

("T1",2,"x1"),
("T1",2,"x2"),
// … etc

Und ich möchte es reduzieren ("T1", 4, List("x1", "x2")). Wie kann ich das machen ?

Ich habe so etwas wie .group(_._1).map{case (key,list) => key-> list.map(_._2).reduce(_+_)}
Aber das funktioniert nicht gemacht und nur die Zahlen summiert, ohne die Liste anzuhängen.

Lösung

Mit groupMapReduce:

val xs = List(
  ("T1",40,"x1"),
  ("T1",2,"x2"),
  ("T2",58,"x3")
)

println(xs.groupMapReduce(_._1)
  (e => (e._2, List(e._3)))
  ({ case ((x, y), (z, w)) => (x + z, y ++ w)})
)

mit groupBy:

val xs = List(
  ("T1",40,"x1"),
  ("T1",2,"x2"),
  ("T2",58,"x3")
)
println(xs.groupBy(_._1)
  .view
  .mapValues(ys => (ys.view.map(_._2).sum, ys.map(_._3)))
  .toMap
)

Wenn Sie es in einem Durchgang pro Liste tun und nicht verwenden möchten, können ++Sie etw. so was:

xs.groupBy(_._1)
  .view
  .mapValues(ys =>
     ys.foldRight((0, List.empty[String])){
       case ((_, n, x), (sum, acc)) => (n + sum, x :: acc)
     }
  )
  .toMap

Alle drei Varianten geben

Map(T2 -> (58,List(x3)), T1 -> (42,List(x1, x2)))

Beachten Sie, dass das Kombinieren vieler Listen mit ++sehr ineffizient werden kann, wenn die Anzahl der Listen groß wird. Es hängt von Ihrem Anwendungsfall ab, ob dies akzeptabel ist oder nicht.


Beantwortet von –
Andrey Tyukin


Antwort geprüft von –
David Marino (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like

[FIXED] Scala – Objekt & Klasse

Ausgabe Ich bin Scala-Anfänger. Ich habe einen Zweifel beim Versuch, Sammlungen zu implementieren. class MyLinkedHashMap[K, V] { var…