我在Scala中有一个序列集,如下所示:
val DaysInMonths = Seq(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
我如何有效地将此序列转换为这样的序列,其中每个元素代表以下元素的总和,如下所示:
val DaysInMonths = Seq(31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365)
我有一个工作解决方案:
DaysInMonths.zipWithIndex.foldLeft(Seq.empty[Int]) {
case (Nil, (cur, _)) => Seq(cur)
case (acc, (cur, 1)) if isLeapYear(year) => acc ++ Seq(acc.last + 29)
case (acc, (cur, i)) => acc ++ Seq(acc.last + cur)
}
但是,因为我是Scala的新手,我想知道应该有更好的&更短的方法来实现同样的目标。
答案 0 :(得分:3)
您可以使用scanLeft
:
scala> DaysInMonths.scanLeft(0)(_ + _)
res1: Seq[Int] = List(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365)
请注意,它会将初始值添加到序列中,您可以决定是保留它还是取尾并忽略它。