2016-11-18 97 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

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