java - 按开始和结束时间戳搜索和检测对象列表中的重叠
问题描述
我有一个列表,我想通过设备字符串属性检测列表中重叠的任务。所以,使命将是:
public class Mission {
private String id;
private String device;
private long startTime;
private long endTime;
}
我收到一个列表并希望返回相同的列表,其中子任务属性设置为“重叠”,如果:
- 在其范围内(从时间戳开始到时间戳结束),同一设备还有另一个任务。
回想一下,我需要标记所有重叠的任务。当我在列表中找到它们时,标记当前的(如果匹配)和在列表中遇到的。
我想用尽可能少的成本来做到这一点。非昂贵的操作。
解决方案
如果您有可能使用额外的内存,我可以为您提供以下算法
创建
HashMap<String, TreeSet<Mission>> map
哪里device
是关键。TreeSet 必须按 排序
startTime
。例子new TreeSet<>(Comparator.comparingLong(Mission::getStartTime))
map
使用列表中的数据进行初始化。这里的主要思想是按 对您的数据进行分组,并按 对device
分组数据进行排序startTime
。然后遍历您的列表并应用以下算法:
- 在创建的地图中找到 TreeSet
TreeSet<Mission> set = map.get(item.device)
:。如果它的大小等于 1,那么您可以移动到列表中的下一个项目,因为这个集合中的唯一项目与列表中的原始项目具有相同的 id。 - 从步骤 1 中收到的带有元素的集合中查找子集,这会
startTime
降低item.endTime
. 如果它的大小等于 1,那么您可以移动到列表中的下一个项目,因为子集的这个唯一项目与列表中的原始项目具有相同的 id。代码示例:set = set.headSet(new Mission().setStartTime(item.getEndTime()))
- 从步骤 2 中找到子集中的第一个元素,这
endTime
比 original 多item.startTime
。我建议您以向后的顺序移动子集set.descendingIterator()
如果您找到一个并且它的 id 不等于原始项目 id,那么您可以将项目标记为重叠并移至列表的下一个项目。否则对子集的下一个元素重复步骤 3 直到结束。
- 在创建的地图中找到 TreeSet
推荐阅读
- node.js - 如何在节点js mongoDB中搜索字符串的一部分
- gradle - 如何设置 Spek 框架
- regex - 用 * 替换字符串的正则表达式
- python - 如何将 datetime64 数组转换为 int?
- pygame - 如何在pygame中获取屏幕中颜色的百分比?
- moosefs - 如何手动清空 moosefs 垃圾文件夹以节省空间
- android - android studio 模拟器中的 Volley 错误,但在真实手机中运行顺畅
- php - MongoDB 文档:可以将数组存储为关联数组吗?
- python - 递归函数二进制转十进制
- python - 如何在python中重复找到每个T数字的数字之和的数字之和,直到它成为一个数字?