多个时间段求并集

复制代码
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); } } } }
复制代码

 

本文作者:盗梦笔记

本文链接:https://www.cnblogs.com/zhaojinhui/p/15927003.html

版权声明:本作品采用zhaojh许可协议进行许可。

posted @   盗梦笔记  阅读(384)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示