Scala中的动态滑动窗口

时间:2018-08-29 11:21:04

标签: scala functional-programming

假设我有一个带有时间戳的事件(页面访问)日志文件。我想将事件分组为多个会话,在这些会话中,如果事件彼此之间的距离不超过X分钟,则它们属于同一会话。

目前,我最终使用了该算法。

val s = List(1000, 501, 500, 10, 3, 2, 1) // timestamps
val n = 10 // time span

import scala.collection.mutable.ListBuffer

(s.head +: s).sliding(2).foldLeft(ListBuffer.empty[ListBuffer[Int]]) {
  case (acc, List(a, b)) if acc.isEmpty =>
    acc += ListBuffer(a)
    acc
  case (acc, List(a, b)) =>
    if (n >= a - b) {
      acc.last += b
      acc
    } else {
      acc += ListBuffer(b)
      acc
    }
}

结果

ListBuffer(ListBuffer(1000), ListBuffer(501, 500), ListBuffer(10, 3, 2, 1))

是否有更好/功能/效率更高的方法?

1 个答案:

答案 0 :(得分:1)

通过更改条件来稍微适应this answer ...

s.foldRight[List[List[Int]]](Nil)((a, b) => b match {
  case (bh @ bhh :: _) :: bt if (bhh + n >= a) => (a :: bh) :: bt
  case _ => (a :: Nil) :: b
})

如果对此原件也进行投票,也请对原件进行投票。