2015-04-20 7 views
0

Давайте представим, что у меня есть такие данные:обжигающего: Заполните прерывности в строках

(Date, Most Active User) 
(6/1/2014, "Bob") 
(6/2/2014, "Joe") 
(6/3/2014, "Jim") 
(6/7/2014, "Jack") 

Извещение есть недостающие строки на дату (6/4/2014), (6/5/2014), (6/6/2014). Я хочу заполнить значение «Самый активный пользователь» по умолчанию для этих строк в последней строке, где это значение определено. Например, значение для этих строк должно быть «Jim».

+0

Что тип (6/1/2014, "Боб")? Это кортеж или массив? И как выглядит строка с отсутствующими данными? – ipoteka

ответ

0

Один из способов сделать это - написать функцию, которая будет рекурсивно перебирать ваши записи и поток дат, сравнивать даты и генерировать другой список записей с отсутствующими датами и пользователем по умолчанию.

Я буду использовать 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)