2016-11-18 100 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沒有,我問Naseebullah他希望在這種情況下的東西,因爲它不是自動清除。 「無」應該視爲零?還是應該發生其他事情? – Jesper

回答

2

展平,收集和點心

展平,收集和總結

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

斯卡拉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 

選項可迭代

看起來相當整齊。

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

斯卡拉REPL

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)=> value} .sum' – pamu

+0

非常感謝!真的很感激它 –