如果时间跨度重叠且少于30分钟,则对日志记录条目进行分组?

时间:2019-02-12 01:52:39

标签: java algorithm data-structures collections

我有一个单一用户的日志条目,其格式如下:

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

因此,在以下示例条目中:

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

查找会话,即将日志条目分组为“会话”。确定会话的条件是:

  1. 如果两个条目的时间跨度重叠,则它们属于同一会话。
  2. 或者如果不重叠,但差距在<30之间,则它们属于同一会话。

示例:输出应类似于:

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

逻辑上我在想什么:

  • 解析该字符串并将其加载到“ LogEntries”类中。
  • 基于“ startTime”对“ entries”集合进行排序。我有实现“可比较”接口的“ LogEntries”类。
  • 现在迭代“ entries”集合并获取所需的输出。输出将是一个字符串列表,其中每个字符串将以逗号分隔。

我想出了下面的代码,但是我对如何处理上面的第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 :(得分:1)

一些想法:

  • 您将时间戳记表示为int / Integer值。这样可以进行简单的排序,但是会使以后的计算更加困难(例如,使两个时间戳之间的差变得更难)。您可以考虑创建一个不同的类来表示这些hour:minute值。
  • 解决任务的方法:首先在一张纸上完成。以您的输入示例为基础,然后根据开始时间对该列表进行排序。
  • 查看排序的时间戳,请查看第一个条目。显然,那一定是会议的开始。现在,您只需查看第一个条目的结束时间和后续条目的开始时间。交叠?然后,会话一继续到第二个条目的结束时间。没有重叠,则计算“开始时间(秒)-结束时间优先”。小于30分钟?会话继续进行,因此您可以与下一个结束时间再次进行比较。否则,会话结束,下一个条目是下一个会话的开始。重复。

长话短说:您必须首先开发一种算法,该算法可以告诉您如何确定会话。然后,您将该指令序列转换为代码。关键是首先从概念上将大问题分解为最小的部分,然后查看如何将它们组合在一起。