运动场上有很多组照明设备,下面A集合中,描述出了不同照明设备的启动(begintime)停止(endtime)时间,照明设备的id已经处理掉了无需考虑,仔细看这些时间段可以发现,这些时间有重合(表示这段时间多组照明同时亮)、有空挡(表示这段时间一组照明都没有开)。请通过java代码实现,获得此足球场上有照明设备开启的时间段集合(求A集合在时间维度上的并集
时间: 2024-03-09 15:47:25 浏览: 158
假设A集合是由多个时间段组成的List,每个时间段包含开始时间和结束时间,可以使用以下Java代码进行求解:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class LightingSchedule {
private static class Interval {
public int start;
public int end;
public Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
public static List<Interval> getLightingSchedule(List<Interval> intervals) {
// 对时间段按照开始时间排序
Collections.sort(intervals, new Comparator<Interval>() {
public int compare(Interval i1, Interval i2) {
return i1.start - i2.start;
}
});
// 遍历时间段,合并重叠的时间段
List<Interval> merged = new ArrayList<>();
for (Interval interval : intervals) {
if (merged.isEmpty() || merged.get(merged.size() - 1).end < interval.start) {
// 如果当前时间段与前一个时间段不重叠,直接加入结果集合
merged.add(interval);
} else {
// 否则更新前一个时间段的结束时间
merged.get(merged.size() - 1).end = Math.max(merged.get(merged.size() - 1).end, interval.end);
}
}
return merged;
}
public static void main(String[] args) {
// 构造时间段集合
List<Interval> intervals = new ArrayList<>();
intervals.add(new Interval(100, 200));
intervals.add(new Interval(150, 300));
intervals.add(new Interval(600, 700));
intervals.add(new Interval(500, 550));
// 获取照明设备开启的时间段集合
List<Interval> lightingSchedule = getLightingSchedule(intervals);
// 输出结果
for (Interval interval : lightingSchedule) {
System.out.println("Start: " + interval.start + " End: " + interval.end);
}
}
}
```
这个程序首先对时间段按照开始时间进行升序排序,然后遍历时间段,对于每个时间段,如果它与前一个时间段不重叠,则直接加入结果集合中;否则,更新前一个时间段的结束时间为当前时间段的结束时间。最终得到的结果就是所有开启的时间段的集合。
阅读全文