java - 如果时间跨度重叠且少于 30 分钟,则对日志条目进行分组?
问题描述
我有以下列格式存在的单个用户的日志条目:
[unique id], [start time],[ end time]
因此,在以下示例条目中:
1,1100,1200
2,1030,1130
3,1420,1500
4,1519,1700
查找会话,即将日志条目分组为“会话”。确定会话的条件是:
- 如果两个条目时间跨度重叠,则它们属于同一会话。
- 或者如果不重叠,但在 < 30 之间的差距,那么它们属于同一个会话。
示例:输出应如下所示:
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;
}
解决方案
一些想法:
- 您将时间戳表示为 int/Integer 值。这允许简单的排序,但会使以后的计算变得更加困难(比如让两个时间戳之间的增量更难)。您可以考虑创建一个不同的类来表示这些小时:分钟值。
- 解决你的任务:首先在一张纸上做。以您的输入示例为例,首先根据开始时间对该列表进行排序。
- 查看排序的时间戳,查看第一个条目。显然,这必须是会话的开始。现在您只需查看第一个条目的结束时间和后续条目的开始时间。重叠?然后第一个会话继续到第二个条目的结束时间。没有重叠,然后您计算“开始时间(秒) - 首先结束时间”。小于30分钟?会话继续,因此您再次与下一个结束时间进行比较。否则,会话结束,下一个条目是下一个会话的开始。重复。
长话短说:您必须首先开发告诉您如何确定会话的算法。然后,您将该指令序列转换为代码。关键是首先从概念上将大问题分解成最小的部分,然后看看如何将它们组合在一起。
推荐阅读
- c# - 如何修复 Xamarin Android 中的“Android.Views.InflateException:二进制 XML 文件第 18 行:错误膨胀类(未找到)LinearLayout”?
- apache-spark - 非流式(批量读写)方法中的 Spark 存储 kafka 偏移检查点
- python - GCP apache气流,如何从私有存储库安装Python依赖项
- angular - 如何解决角度中的跳过位置更改问题
- cdn - 配置 Akamai 以单独缓存下一代图像
- reactjs - 使用 prevState 更新状态,但当来自父级的道具发生变化时
- angular - Angular 8如何在三个组件之间传递数据
- c# - Xamarin.Android - RSACryptoServiceProvider CspParameters 为 null 并且 CryptoKeySecurity 为 null 使用 X509Certificate2
- javascript - Angular 7:使用 Rxjs observbles 时的 ExpressionChangedAfterItHasBeenCheckedError
- php - 我在 SteamAuth.php 第 206 行收到“ErrorException:未定义偏移量:1”