2

タイムスタンプのリストを間隔に変換するスカラ関数を書きました

  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 など、1 つまたは 2 つのライナーがあると感じています。何かアドバイス?

4

2 に答える 2

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

あなたのワンライナーです。ただし、1回だけの方が効率的val times = timestamps.map(_.toLong)です(これにより、2ライナーになります)。

于 2013-05-14T15:58:40.873 に答える
1

受け入れられた答えは素晴らしいですが、代替案を提供したかっただけです:

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

于 2013-05-14T18:35:25.127 に答える