• 多个时间段求并集


    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); } } } }
  • 相关阅读:
    「2013-8-5」企业基因
    HashMap和ConcurrentHashMap详解
    JVM 详解
    Dubbo 项目学习(四) 接口抽取以及依赖版本统一
    Dubbo 项目学习(三) 消费Dubbo服务
    Dubbo 项目学习(二) 发布Dubbo服务
    Spring Boot 日志问题记录
    Dubbo 项目学习(一) Admin 管理控制台
    Idea 搭建 SSM 项目框架
    Idea 搭建 SSH 项目框架
  • 原文地址:https://www.cnblogs.com/zhaojinhui/p/15927003.html
Copyright © 2020-2023  润新知