将时间戳转换为间隔

时间:2013-05-14 15:55:38

标签: scala functional-programming

我写了一个scala函数,它将时间戳列表转换为间隔

  def toIntervals(timestamps: List[String]) = {
    def helper(timestamps: List[String], accu: List[Long]): List[Long] = {
      if (timestamps.tail.isEmpty) accu.reverse
      else {
        val first = timestamps.head.toLong
        val second = timestamps.tail.head.toLong
        val newHead = second - first
        helper(timestamps.tail, newHead :: accu)
      }
    }
    helper(timestamps, List())
  }

并且没有尾调声

  def toIntervals(timestamps: List[String]) : List[Long]  = {
      if (timestamps.tail.isEmpty) List()
      else {
        val first = timestamps.head.toLong
        val second = timestamps.tail.head.toLong
        val newHead = second - first
        newHead :: toIntervals(timestamps.tail)
      }
    }

但我觉得有一个/两个衬垫,例如map2。有什么建议吗?

2 个答案:

答案 0 :(得分:6)

(timestamps.tail, timestamps).zipped.map(_.toLong - _.toLong)

是你的一线;但是val times = timestamps.map(_.toLong)只有一次效率更高(这会使它成为一个双线)。

答案 1 :(得分:1)

接受的答案很棒,只是想提供另一种选择:

timetamps.sliding(2).map { case Seq(a,b) => b - a }