多个时间段求并集

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); } } } }

 

posted @ 2022-02-23 13:47  zhαojh  阅读(364)  评论(0编辑  收藏  举报