Один из способов сделать это - написать функцию, которая будет рекурсивно перебирать ваши записи и поток дат, сравнивать даты и генерировать другой список записей с отсутствующими датами и пользователем по умолчанию.
Я буду использовать scala.collection.immutable.Stream
и nscala для моего примера. Nscala - простая оболочка для javaTime java. Чтобы использовать его, добавьте libraryDependencies += "com.github.nscala-time" %% "nscala-time" % "1.8.0"
в ваш файл build.sbt
. Рабочий код:
import scala.collection.immutable.Stream
import com.github.nscala_time.time.Imports._
//formatter to compare strings in your record with DateTime
val fmt = DateTimeFormat.forPattern("M/d/yyyy")
//Stream lazy magic is here. We create infinite stream of days
def days(start: DateTime): Stream[DateTime] = start #:: days(start + 1.day)
val records = List(("6/1/2014", "Bob"), ("6/2/2014", "Joe"),
("6/3/2014", "Jim"), ("6/7/2014", "Jack"))
//Recursion here
def fillDefaultValues(records: List[(String, String)],
days: Stream[DateTime]): List[(String, String)] =
//Let be cautious and use headOption.
(records.headOption, days.headOption) match {
case (Some((date, name)), Some(day)) if date == day.toString(fmt) =>
(date, name) :: fillDefaultValues(records.tail, days.tail)
case (Some((date, name)), Some(day)) =>
(day.toString(fmt), "Most Active User") ::
fillDefaultValues(records, days.tail)
case (None, _) => Nil
case (Some((date, name)), None) => throw new Exception("Days are out")
}
fillDefaultValues(records, days(new DateTime(2014, 6, 1, 0, 0)).slice(0, 100)).foreach(println)
И Ouput:
(6/1/2014,Bob)
(6/2/2014,Joe)
(6/3/2014,Jim)
(6/4/2014,Most Active User)
(6/5/2014,Most Active User)
(6/6/2014,Most Active User)
(6/7/2014,Jack)
Что тип (6/1/2014, "Боб")? Это кортеж или массив? И как выглядит строка с отсутствующими данными? – ipoteka