多个时间段求并集
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); } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步