连续数组元素的计算

时间:2016-08-21 12:57:55

标签: scala

我有这个:

val myInput:ArrayBuffer[(String,String)] = ArrayBuffer(
    (a,timestampAStr),
    (b,timestampBStr),
    ...
)

我想计算myInput每两个连续时间戳之间的持续时间,并检索以下内容:

val myOutput = ArrayBuffer(
    (a,durationFromTimestampAToTimestampB),
    (b,durationFromTimestampBToTimestampC),
    ...
)

这是一个配对的评估,这让我认为foldLeft()的某些内容可能会有所帮助,但是在给予这一点后,我无法想出解决方案。

我已经将某些内容与for loops.indices放在一起了,但这看起来并不简洁。如果有人有更好的选择,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以使用zipsliding来实现您的目标。例如,如果您有一个集合

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)