从布尔值列表到求和整数列表的scala匹配

从布尔值列表到求和整数列表的scala匹配,scala,Scala,我有一个关于scala/spark列表匹配的一般性问题。假设我有一个布尔值列表,形式如下: List(true, false, false ,true, true) 我希望将此布尔值列表转换为如下内容: List(1, 1, 1, 2, 3) 这样,每当有一个true时,列表就会添加1,而每当有一个false时,它就会输出上一个结果。我认为有一些非常有效的方法可以在不循环的情况下实现这一点,但现在想不出任何方法。您可以使用scanLeft实现这一点: List(true, false, fa

我有一个关于scala/spark列表匹配的一般性问题。假设我有一个布尔值列表,形式如下:

List(true, false, false ,true, true)
我希望将此布尔值列表转换为如下内容:

List(1, 1, 1, 2, 3)

这样,每当有一个true时,列表就会添加1,而每当有一个false时,它就会输出上一个结果。我认为有一些非常有效的方法可以在不循环的情况下实现这一点,但现在想不出任何方法。

您可以使用
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)
scanleet
帮助您生成部分和序列,这基本上就是您在这里看到的。在
情况(sum,next)
中,
sum
表示当前累积值,
next
表示
列表中的下一个元素。因此,我们检查
next
是否为真,如果为真,则添加一个,否则返回当前总和。
scanleet
中返回的每个元素都将添加到最终的
列表中


请注意,我必须为它添加
0
,我在最后只添加
列表的
尾部
,从而删除了它。否则我会有
列表(0,1,1,1,2,3)

听起来你在寻找scanLeft:

val bs = List(true, false, false, true, true)
val is = bs.scanLeft(0){ case (acc, el) => if (el) acc + 1 else acc }.tail
// "is" is equal to List[Int] = List(1, 1, 1, 2, 3)
如果采用完整列表而不是尾部,则由于起始值为0,结果为
list[Int]=list(0,1,1,1,2,3)


这是。

是的,在True时添加一个。这与apache spark有什么关系?感谢您提供的解决方案,我从未使用过scanLeft,经常需要解决复制、删除第一个/最后一个并将它们压缩在一起的问题。不错,我想
tail
会比
drop(1)
更清晰一些。这真的是边缘地带。