Как составить список кортежей

Учитывая следующий список кортежей...

val list = List((1, 2), (1, 2), (1, 2))

... как суммировать все значения и получить один кортеж, подобный этому?

(3, 6)

Ответ 1

Использование метода 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) 

Ответ 2

Очень просто: (list.map(_._1).sum, list.map(_._2).sum).

Ответ 3

Вы можете решить это, используя 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 с кошками.

Ответ 4

отвечая на этот вопрос, пытаясь понять агрегатную функцию в искре

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

Ответ 5

Решение Scalaz (предложено Трэвисом и почему-то удаленным ответом):

import scalaz._
import Scalaz._

val list = List((1, 2), (1, 2), (1, 2))
list.suml

какие выводы

res0: (Int, Int) = (3,6)