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))