2015-05-10 3 views
7

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

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

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

(3, 6) 
+1

Обратите внимание, что если вы используете Scalaz, вы автоматически получаете моноидные экземпляры для кортежей, чьи элементы имеют моноидные экземпляры, поэтому вы можете просто написать 'list.suml'. –

ответ

15

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

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

+3

Не проходит ли этот список дважды? Тогда это не так эффективно. – Armin

Смежные вопросы