public static List<MkSampleTime>mergeDate(List<MkSampleTime> list, Long sampleId) {
//使用有序map存储时间
Map dateMap = new ConcurrentSkipListMap();
for (int i = 0; i < list.size(); i++) {
MkSampleTime time = list.get(i);
dateHandle(dateMap, time.getBeginTime(), time.getEndTime());
}
//得到最终并集时间段的结果
List<MkSampleTime> listNew = new ArrayList<>();
dateMap.forEach((key, value) - >{
System.out.println(key + "|" + value);
listNew.add(new MkSampleTime((Date) key, (Date) value, sampleId));
});
return listNew;
}
public static void dateHandle(Map dateMap, Date startTime, Date endTime) {
if (startTime.after(endTime)) {
//异常处理跳出 开始时间大于结束时间
return;
}
if (MapUtils.isEmpty(dateMap)) {
//第一个时间段直接添加
dateMap.put(startTime, endTime);
return;
}// 1、有交集就合并 2、没有交集就添加
Iterator iterator = dateMap.entrySet().iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
Map.Entry entry = (Map.Entry) obj;
Date start = (Date) entry.getKey();
Date end = (Date) entry.getValue();
if (startTime.before(start) && (endTime.after(start) || endTime.equals(start)) && (endTime.before(end) || endTime.equals(end))) {
//起点早于该区间 终点属于该区间
iterator.remove();
dateMap.put(startTime, end);
} else if (startTime.before(start) && endTime.after(end)) {
//起点早于该区间 终点晚于该区间
iterator.remove();
dateMap.put(startTime, endTime);
} else if ((startTime.after(start) || startTime.equals(start)) && (startTime.before(end) || startTime.equals(end)) && endTime.after(end)) {
//起点属于该区间 终点晚于该区间
iterator.remove();
dateMap.put(start, endTime);
} else if (startTime.after(end) || endTime.before(start)) {
//起点晚于该区间 或 终点早于该区间(即完全没重叠直接添加)
if (!iterator.hasNext()) {
dateMap.put(startTime, endTime);
}
}
}
}