多个时间合并并集mysql_写个 Go 时间交并集小工具

该博客介绍了一个使用Go语言编写的计算时间交并集的工具,适用于处理甘特图场景下的时间合并问题。通过定义时间结构T,实现排序接口,并提供Union和Intersect方法分别计算时间并集和交集。示例代码展示了如何生成随机时间切片并进行测试,最终展示了一个10个时间段的输入如何得到其并集。
摘要由CSDN通过智能技术生成

示例代码(含测试)在这里

需求

在甘特图的场景下,我们经常会遇到这种情况,五位员工A, B, C, D, E,可能他们的工作都是并行的,我们需要计算

某段时间内他们总的工作时长。

我们不能简单得把五个人的工作时间都加起来,因为当中会有重叠的部分。

所以这时候我们就需要一个计算时间交并集的工具。

思路

将一组离散的时间段按照开始时间,从小到大排序。像这样

[{2 7} {4 11} {10 19} {10 30} {16 18} {19 29} {23 35} {24 42} {25 30} {27 49}]

我这里将时间用十分小的秒来代替,方便理解。

循环排序后的数组,如果下一个时间段开始时间介于上个时间段的开始时间和结束时间之间,那么就进行合并,否则就分离。

可以看到我们这里有两个关键动作,合并,分离,而这个就是我们要实现的核心代码。

实现

一段连续的工作时间都会有两个点,开始时间和结束时间。

所以我们可以把这个时间结构设计成:

type T struct {

Start int64

End int64

}

而一个人的工作时间是由多个 T 组成的,所以我们在定义一个切片类型

type TSlice []T

为了能顺序合并时间,我们需要将TSlice进行排序。

我们知道 Go 中有个 sort 包,我们只需要实现 sort 类型的接口,就能实现 TSlice 的排序了。

我们实现下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值