2016-11-18 8 views
1

У меня есть список вариант, как это так,Как добавить список Варианта двойников в Скале

var data = List(
    List(Some(313.062468), Some(27.847252)), 
    List(Some(301.873641), Some(42.884065)), 
    List(Some(332.373186), Some(53.509768)) 
) 

И я хотел бы суммировать все значения каждого вложенного списка.

У меня есть следующий код, который не работает:

return data.flatten.foldLeft((Some(0), Some(0))) { 
    case ((accA, accB), (a, b)) => { 
    (_ + a, _ + b) 
    } 
} 
+0

Что должно произойти, если один или оба из вариантов является 'None' вместо' Some'? – Jesper

+0

@ Jesper это сработает для вас – pamu

+0

@pamu Нет, я спрашиваю Насебуллы, что он хочет в этом случае, потому что это не так понятно. Должен ли «Нет» считаться нулем? Или должно произойти что-то еще? – Jesper

ответ

2

Flatten, Collect и Sum

Flatten, собирать и просуммировать

data.flatten.collect { case Some(value) => value }.sum 

Scala REPL

scala> var data = List(
    | List(Some(313.062468), Some(27.847252)), 
    | List(Some(301.873641), Some(42.884065)), 
    | List(Some(332.373186), Some(53.509768)) 
    |) 
data: List[List[Some[Double]]] = List(List(Some(313.062468), Some(27.847252)), List(Some(301.873641), Some(42.884065)), List(Some(332.373186), Some(53.509768))) 

scala> 

scala> data.flatten 
res2: List[Some[Double]] = List(Some(313.062468), Some(27.847252), Some(301.873641), Some(42.884065), Some(332.373186), Some(53.509768)) 

scala> data.flatten.collect { case Some(value) => value }.sum 
res3: Double = 1071.55038 

Опция iserable

Выглядит довольно аккуратно.

data.iterator.flatMap(_.iterator.flatMap(_.iterator)).sum 

Scala РЕПЛ

scala> data.iterator.flatMap(_.iterator.flatMap(_.iterator)).sum 
res5: Double = 1071.55038 

Для понимания

(for { 
    list <- data.iterator 
    elem <- list.iterator 
    value <- elem.iterator 
    } yield value).sum 
+0

Спасибо! И что, если я хочу только суммировать только первый вложенный список? –

+0

@NaseebullahSafi, если вам нужна только сумма первого списка ... просто получите головку списка и выполните тот же процесс. 'data.head.collect {case Some (value) => значение} .sum' – pamu

+0

Большое вам спасибо! Действительно ценю это –

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

  • Нет связанных вопросов^_^