Scala 连续数组元素的计算

Scala 连续数组元素的计算,scala,Scala,我有这个: val myInput:ArrayBuffer[(String,String)] = ArrayBuffer( (a,timestampAStr), (b,timestampBStr), ... ) 我想从myInput计算每两个连续时间戳之间的持续时间,并检索如下所示: val myOutput = ArrayBuffer( (a,durationFromTimestampAToTimestampB), (b,durationFromTim

我有这个:

val myInput:ArrayBuffer[(String,String)] = ArrayBuffer(
    (a,timestampAStr),
    (b,timestampBStr),
    ...
)
我想从
myInput
计算每两个连续时间戳之间的持续时间,并检索如下所示:

val myOutput = ArrayBuffer(
    (a,durationFromTimestampAToTimestampB),
    (b,durationFromTimestampBToTimestampC),
    ...
)
这是一个成对的评估,这让我想到使用
foldLeft()
的方法可能会奏效,但在仔细考虑之后,我无法想出一个解决方案


我已经为循环和索引组合了一些
,但这看起来并不像它可能的那样干净和简洁。如果有人有更好的选择,我将不胜感激。

您可以在删除第一项(将每个项与连续项匹配)后,将数组本身压缩,然后映射到计算结果:

val myInput:ArrayBuffer[(String,String)] = ArrayBuffer(
  ("a","1000"),
  ("b","1500"),
  ("c","2500")
)

val result: ArrayBuffer[(String, Int)] = myInput.zip(myInput.drop(1)).map {
  case ((k1, v1), (k2, v2)) => (k1, v2.toInt - v1.toInt)
}
result.foreach(println)
// prints:
// (a,500)
// (b,1000)

您可以使用
zip
slide
来实现您想要的功能。例如,如果您有一个集合

scala> List(2,3,5,7,11)
res8: List[Int] = List(2, 3, 5, 7, 11)
差异列表是
res8.slideing(2).map{case list(fst,snd)=>snd fst}.toList
,您可以将其与原始列表压缩

scala> res8.zip(res8.sliding(2).map{case List(fst,snd)=>snd-fst}.toList)
res13: List[(Int, Int)] = List((2,1), (3,2), (5,2), (7,4))