我有这个:
val myInput:ArrayBuffer[(String,String)] = ArrayBuffer(
(a,timestampAStr),
(b,timestampBStr),
...
)
我想计算myInput
每两个连续时间戳之间的持续时间,并检索以下内容:
val myOutput = ArrayBuffer(
(a,durationFromTimestampAToTimestampB),
(b,durationFromTimestampBToTimestampC),
...
)
这是一个配对的评估,这让我认为foldLeft()
的某些内容可能会有所帮助,但是在给予这一点后,我无法想出解决方案。
我已经将某些内容与for loops
和.indices
放在一起了,但这看起来并不简洁。如果有人有更好的选择,我将不胜感激。
答案 0 :(得分:2)
您可以使用zip
和sliding
来实现您的目标。例如,如果您有一个集合
scala> List(2,3,5,7,11)
res8: List[Int] = List(2, 3, 5, 7, 11)
差异列表为res8.sliding(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))
答案 1 :(得分:1)
在删除第一项后,您可以zip
自己的数组 - 将每个项目与连续项目匹配 - 然后映射到计算结果:
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)