给出以下元组列表......
val list = List((1, 2), (1, 2), (1, 2))
...如何将所有值相加并获得这样的单个元组?
(3, 6)
答案 0 :(得分:19)
使用foldLeft
方法。有关详细信息,请查看scaladoc。
scala> val list = List((1, 2), (1, 2), (1, 2))
list: List[(Int, Int)] = List((1,2), (1,2), (1,2))
scala> list.foldLeft((0, 0)) { case ((accA, accB), (a, b)) => (accA + a, accB + b) }
res0: (Int, Int) = (3,6)
使用unzip
。不如上述解决方案有效。也许更具可读性。
scala> list.unzip match { case (l1, l2) => (l1.sum, l2.sum) }
res1: (Int, Int) = (3,6)
答案 1 :(得分:11)
非常简单:(list.map(_._1).sum, list.map(_._2).sum)
。
答案 2 :(得分:1)
您可以使用Monoid.combineAll
库中的cats
解决此问题:
import cats.instances.int._ // For monoid instances for `Int`
import cats.instances.tuple._ // for Monoid instance for `Tuple2`
import cats.Monoid.combineAll
def main(args: Array[String]): Unit = {
val list = List((1, 2), (1, 2), (1, 2))
val res = combineAll(list)
println(res)
// Displays
// (3, 6)
}
您可以在cats documentation或Scala with Cats中查看有关此内容的更多信息。
答案 3 :(得分:1)
Scalaz解决方案(由Travis建议,由于某种原因删除了答案):
recommended
输出
import scalaz._
import Scalaz._
val list = List((1, 2), (1, 2), (1, 2))
list.suml
答案 4 :(得分:0)
在尝试了解spark中的聚合函数时回答此问题
scala> val list = List((1, 2), (1, 2), (1, 2))
list: List[(Int, Int)] = List((1,2), (1,2), (1,2))
scala> list.aggregate((0,0))((x,y)=>((y._1+x._1),(x._2+y._2)),(x,y)=>(x._1+y._2,y._2+x._2))
res89: (Int, Int) = (3,6)
以下是SO QA的链接,有助于理解和回答此问题[Explain the aggregate functionality in Spark