2015-09-01 2 views
2

У меня проблема, и я действительно не знаю, как это сделать на правильном пути Scala.Scala Список фильтров по дате разница

У меня есть список объектов, содержащих дату. Я хочу сделать что-то вроде этого:

lists

Я хочу, чтобы сделать выбор, используя приемлемое значение времени, как 2 часа, между 2 преемниками в списке. Цель состоит в том, чтобы удерживать тренд пользователя по сравнению с точкой (если он показывает 2 раза здесь, или 1 или 15!).

алгоритм я представлял себе:

  • Давайте держать 2 точки А и B. Вычислим разницу во времени между 2 точками, а затем оценить, если это приемлемо или нет (> 2h, приемлемо).
  • Если это неприемлемо, мы отклоняем B, а затем новый B является следующим элементом списка.
  • Если приемлемо, B становится A, а новый B является следующим элементом списка.

Как это сделать, с некоторыми фильтрами или сборами? О, и если алгоритм не подходит для вас, я открыт для критики!

Редактировать: Я не прошу разрешения, но только правильные функции для поиска!

ответ

6

Скажем, у меня есть список целых чисел, и я хочу пройти через них и сохранить только те, которые больше 1 больше, чем предыдущие. Я бы воспользовался функцией foldLeft, чтобы выполнить их, создав список только приемлемых элементов:

val nums = List(1,2,4,5,7) 

nums.foldLeft(List[Int]()){ 
    case (List(), b) => List(b) 
    case (list, b) if b - list.head > 1 => list :+ b 
    case (list, b) => list 
} 
+3

Приятное и четкое объяснение. 'b :: list' в среднем случае +' .reverse' на результат будет более эффективным –

+0

@TheArchetypalPaul Можете ли вы объяснить, почему это более эффективно? – mattinbits

+1

Небольшая измененная версия: 'nums.foldLeft (List [Int]()) {case (Nil, b) => List (b); case (ls @ (x :: xs), b) => if (b-x> 1) b :: ls else ls} .reverse' – Eastsun