示例代码(含测试)在这里
需求
在甘特图的场景下,我们经常会遇到这种情况,五位员工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 的排序了。
我们实现下: