【问题标题】:Dynamic sliding window in ScalaScala中的动态滑动窗口
【发布时间】:2018-08-29 11:21:04
【问题描述】:

假设,我有一个带有时间戳的事件(页面访问)日志文件。我想将事件分组到会话中,在这些会话中,当事件之间的距离不超过 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))

有没有更好/功能/有效的方法来做到这一点?

【问题讨论】:

  • 澄清一下,对于时间跨度 10,4、10、16 是否都在同一个会话中,即使外部两个相隔超过 10?也就是说,您如何处理重叠会话?
  • 这个问题是对这个stackoverflow.com/q/52018499/5986907的轻微(微不足道?)概括
  • @JoelBerkeley for timespan 10, are 4, 10, 16 all in the same session 是的,他们是

标签: scala functional-programming


【解决方案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
})

如果你点赞这个,也请点赞原版

【讨论】:

    猜你喜欢
    • 2012-03-05
    • 2016-03-06
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2012-10-20
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多