我有一个月份的清单:
val days = List(31, 28, 31, ...)
Run Code Online (Sandbox Code Playgroud)
我需要返回一个累积天数的List:
val cumDays = List(31, 59, 90)
Run Code Online (Sandbox Code Playgroud)
我想过使用fold运算符:
(0 /: days)(_ + _)
Run Code Online (Sandbox Code Playgroud)
但这只会返回最终结果(365),而我需要中间结果列表.
无论如何,我可以优雅地做到这一点?
sep*_*p2k 54
Scala 2.8有这些方法scanLeft,scanRight并且正是这样做的.
对于2.7,您可以scanLeft像这样定义自己的:
def scanLeft[a,b](xs:Iterable[a])(s:b)(f : (b,a) => b) =
xs.foldLeft(List(s))( (acc,x) => f(acc(0), x) :: acc).reverse
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
scala> scanLeft(List(1,2,3))(0)(_+_)
res1: List[Int] = List(0, 1, 3, 6)
Run Code Online (Sandbox Code Playgroud)
Lan*_*dei 18
我不确定为什么每个人似乎都坚持使用某种折叠,而你基本上想要将值映射到累积值......
val daysInMonths = List(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
val cumulated = daysInMonths.map{var s = 0; d => {s += d; s}}
//--> List[Int] = List(31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365)
Run Code Online (Sandbox Code Playgroud)
小智 6
你可以简单地执行它:
daysInMonths.foldLeft((0, List[Int]()))
{(acu,i)=>(i+acu._1, i+acu._1 :: acu._2)}._2.reverse
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9369 次 |
| 最近记录: |