scala匹配从布尔列表到求和Int列表

Gam*_*ows 2 scala

我有一个关于scala/spark列表匹配的一般问题.假设我有以下形式的布尔列表:

List(true, false, false ,true, true)
Run Code Online (Sandbox Code Playgroud)

我希望将此布尔列表转换为:

List(1, 1, 1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

这样每次有一个true时,List加1,每次有一个false,它输出前一个结果.我认为有一些非常有效的方法来做到这一点没有循环,但现在不能想到任何...

Mic*_*jac 5

你可以使用scanLeft这个:

List(true, false, false, true, true).scanLeft(0) { case (sum, next) =>
    if(next) sum + 1 else sum
}.tail

res45: List[Int] = List(1, 1, 1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

scanLeft帮助您生成一系列部分和,这基本上就是您在这里所拥有的.In case (sum, next),sum表示当前的累计值,并next表示该中的下一个元素List.所以我们检查是否next为真,如果是,则添加一个,否则返回当前总和.返回的每个元素scanLeft都会添加到final中List.

请注意,我必须播种它0,最后我只删除tail了它List.否则我会有List(0, 1, 1, 1, 2, 3).