Группировать записи в журнале, если промежуток времени перекрывается и составляет менее 30 минут? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть записи журнала для одного пользователя, которые существуют в следующем формате:

[unique id], [start time],[ end time]

Итак, в следующих примерах записей:

1,1100,1200
2,1030,1130
3,1420,1500
4,1519,1700

Поиск сеансов, т. Е. Журнал группызаписи в качестве «сессий».Условия для определения сеанса:

  1. Если интервал времени между двумя записями перекрывается, то они принадлежат одному и тому же сеансу.
  2. Или, если не перекрываются, но промежуток между <30,затем они принадлежат одному сеансу. </li>

Пример: вывод должен быть таким:

Session 1: 1, 2
Session 2: 3, 4

Логика, о которой я думаю:

  • Разбор строки и загрузка ее в класс "LogEntries".
  • Сортировка коллекции записей по принципу startTime.У меня есть класс "LogEntries", реализованный "Comparable" интерфейс.
  • Теперь итерации коллекции "записи" и получить требуемый вывод.Выводом будет список строк, где каждая строка будет разделена запятой.

Я пришел с кодом ниже, но я не совсем понимаю, как работать с логикой пункта 3 выше.

  private static List<String> groupSessions(List<String> inputs) {
    List<String> output = new ArrayList<>();
    List<LogEntries> entries = new ArrayList<>();
    for (String input : inputs) {
      String[] arr = input.split(",");
      LogEntries entry =
          new LogEntries(Integer.parseInt(arr[0]), Integer.parseInt(arr[1]),
              Integer.parseInt(arr[2]));
      entries.add(entry);
    }

    // sort it basis on startTime
    Collections.sort(entries);

    // now iterate the entries list - this is where I am confuse
    for (int i = 0; i < entries.size(); i++) {
      // do some stuff
    }

    return output;
  }

1 Ответ

0 голосов
/ 12 февраля 2019

Некоторые мысли:

  • вы представляете свои временные метки в виде целых / целочисленных значений.Это позволяет выполнять простую сортировку, но сделает последующие вычисления более сложными (например, увеличение разницы между двумя временными метками).Вы можете подумать о создании отдельного класса для представления значений часов: минут.
  • для решения вашей задачи: начните с этого на листе бумаги.Возьмите пример ввода и начните с сортировки этого списка по времени начала.
  • Глядя на отсортированные метки времени, посмотрите на первую запись.Очевидно, это должно быть началом сессии.Теперь вы просто смотрите на время окончания этой первой записи и время начала следующей записи.Перекрытие?Затем первая сессия продолжается до времени окончания второй записи.Нет перекрытия, затем вы вычисляете «время начала (секунда) - время окончания сначала».Меньше 30 минут?Сеанс продолжается, поэтому вы снова сравниваете его со следующим временем окончания.В противном случае сеанс завершается, и следующая запись является началом следующего сеанса.Повторение.

Короче говоря: сначала вы должны разработать алгоритм, который скажет вам, как определять сеансы.Затем вы превращаете эту последовательность инструкций в код.Ключ заключается в том, чтобы сначала концептуально разделить большую проблему на ее самые маленькие части, а затем посмотреть, как их объединить.

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