Динамическое раздвижное окно в Скале - PullRequest
0 голосов
/ 29 августа 2018

Предположим, у меня есть файл журнала событий (посещений) с отметкой времени. Я хотел бы сгруппировать события в сеансы, где я считаю, что события принадлежат одному и тому же сеансу, если они не дальше чем 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 голосов
/ 29 августа 2018

Слегка адаптируя этот ответ , изменяя условие ...

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
})

Пожалуйста, оставьте отзыв также оригинальным, если вы проголосуете за него

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...