Учитывая следующий список кортежей...
val list = List((1, 2), (1, 2), (1, 2))
... как суммировать все значения и получить один кортеж, подобный этому?
(3, 6)
Учитывая следующий список кортежей...
val list = List((1, 2), (1, 2), (1, 2))
... как суммировать все значения и получить один кортеж, подобный этому?
(3, 6)
Использование метода 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)
Очень просто: (list.map(_._1).sum, list.map(_._2).sum)
.
Вы можете решить это, используя 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)
}
Вы можете увидеть больше об этом в документации по кошкам или Scala с кошками.
отвечая на этот вопрос, пытаясь понять агрегатную функцию в искре
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, которая помогла понять и ответить на этот вопрос [ Объясните совокупную функциональность в Spark
Решение Scalaz (предложено Трэвисом и почему-то удаленным ответом):
import scalaz._
import Scalaz._
val list = List((1, 2), (1, 2), (1, 2))
list.suml
какие выводы
res0: (Int, Int) = (3,6)