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)