Scala序列,每个元素代表所有先前元素的总和

时间:2016-02-01 19:37:55

标签: scala collections sequence

我在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的新手,我想知道应该有更好的&更短的方法来实现同样的目标。

1 个答案:

答案 0 :(得分:3)

您可以使用scanLeft

scala>   DaysInMonths.scanLeft(0)(_ + _)
res1: Seq[Int] = List(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365)

请注意,它会将初始值添加到序列中,您可以决定是保留它还是取尾并忽略它。