Java 多个时间区间进行合并处理方法

 更新时间:2024年02月01日 10:09:42   作者:kk_star  
用户在选择多个时间区间之后,如选择的时间区间连续或者有重叠,需要对所选的时间区间进行合并,这其实是一个区间合并问题,下面通过本文给大家介绍Java 多个时间区间进行合并处理的解决方案,一起看看吧

需求:用户在选择多个时间区间之后,如选择的时间区间连续或者有重叠,需要对所选的时间区间进行合并

这其实是一个区间合并问题,为了简化操作,将拿到的集合进行排序后再合并

废话不多说,源码如下:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * @ClassName DateU
 * @Description TODO
 * @Author kk_star
 * @Date 2021/4/9 14:59
 */
public class DateU {
    public static void main(String[] args) {
        List<DateEntity> list = new ArrayList<>();
        DateEntity de1 =  new DateEntity("2021-01-10","2021-02-15");
        DateEntity de2 =  new DateEntity("2021-01-01","2021-01-06");
        DateEntity de3 =  new DateEntity("2021-03-01","2021-03-15");
        DateEntity de4 =  new DateEntity("2021-01-07","2021-01-09");
        DateEntity de5 =  new DateEntity("2021-02-16","2021-02-28");
        list.add(de1);
        list.add(de2);
        list.add(de3);
        list.add(de4);
        list.add(de5);
        //list排序,方便合并操作
        sort(list);
        System.out.println("合并前:"+list.toString());
        List<DateEntity> resultList = handle(list);
        sort(resultList);
        System.out.println("合并后:"+resultList);
    }
    /*
     * @Description 获取两个时间之间相差的天数
     * @Author kk_star
     * @Date 2021/4/9 16:59
     * @param date1
     * @param date2
     * @return long
     */
    public static long getDiffDays(Date date1,Date date2){
        long t1 = date1.getTime();
        long t2 = date2.getTime();
        if(t1 == t2){
            return 0L;
        }else if(t1>t2){
            return (t1-t2)/(1000*60*60*24);
        }else{
            return (t2-t1)/(1000*60*60*24);
        }
    }
    /**
     * @Description 操作-从list尾部往前逐个合并
     * @Author kk_star
     * @Date 2021/4/9 17:00
     * @param list
     * @return java.util.List<DateEntity>
     */
    public static List<DateEntity> handle(List<DateEntity> list){
        List<DateEntity> resultList = new ArrayList<>();
        for (int i=1;;i++){
            if(list.size()<=1){
                if(list.size()==1){
                    resultList.add(list.get(0));
                }
                break;
            }
            DateEntity last = list.get(list.size()-1);
            DateEntity beLast = list.get(list.size()-2);
            DateEntity m = mergeTime(beLast,last);
            if(null != m){
                list.remove(last);
                list.remove(beLast);
                list.add(m);
            }else{
                resultList.add(last);
                list.remove(last);
            }
        }
        return resultList;
    }
    /**
     * @Description 两个时间区间合并操作
     * @Author kk_star
     * @Date 2021/4/9 17:00
     * @param beLast
     * @param last
     * @return DateEntity
     */
    public static DateEntity mergeTime(DateEntity beLast,DateEntity last){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        DateEntity result = new DateEntity();
        try{
            Date d2 = sdf.parse(beLast.getEndTime());
            Date d3 = sdf.parse(last.getStartTime());
            Date d4 = sdf.parse(last.getEndTime());
            if(d2.getTime()>=d3.getTime()){
                result.setStartTime(beLast.getStartTime());
                if(d2.getTime()>=d4.getTime()){
                    result.setEndTime(beLast.getEndTime());
                }else{
                    result.setEndTime(last.getEndTime());
                }
                return result;
            }else{
                if(getDiffDays(d2,d3)<=1){
                    result.setStartTime(beLast.getStartTime());
                    result.setEndTime(last.getEndTime());
                    return result;
                }else{
                    return null;
                }
            }
        }catch (Exception e){
            System.err.println(e.getMessage());
        }
        return null;
    }
    /**
     * @Description list排序操作,根据时间区间起始值排序
     * @Author kk_star
     * @Date 2021/4/9 17:02
     * @param list
     * @return void
     */
    public static void sort(List<DateEntity> list){
        Collections.sort(list, new Comparator<DateEntity>() {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            @Override
            public int compare(DateEntity o1, DateEntity o2) {
                try {
                    if(sdf.parse(o1.getStartTime()).getTime()-sdf.parse(o2.getStartTime()).getTime()>=0){
                        return 1;
                    }else{
                        return -1;
                    }
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                return 0;
            }
        });
    }
}
import lombok.Data;
/**
 * @ClassName DateEntity
 * @Description TODO
 * @Author kk_star
 * @Date 2021/4/9 15:15
 */
@Data
public class DateEntity {
    public String startTime;
    public String endTime;
    public DateEntity(String startTime, String endTime) {
        this.startTime = startTime;
        this.endTime = endTime;
    }
    public DateEntity() {
    }
}

到此这篇关于Java 多个时间区间进行合并处理的文章就介绍到这了,更多相关Java 多个时间区间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

    java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

    这篇文章主要介绍了java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三种常用的 PDF 处理库,它们各自具有独特的优势和特点,同时也存在一些局限性和差异,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • Java实现文件图片的预览和下载功能

    Java实现文件图片的预览和下载功能

    这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • spring实现静态注入(类或者属性)操作示例

    spring实现静态注入(类或者属性)操作示例

    这篇文章主要为大家介绍了spring实现静态注入(类或者属性)操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java输入输出流的使用详细介绍

    Java输入输出流的使用详细介绍

    本篇文章介绍了,在Java中输入输出流的使用详细分析。需要的朋友参考下
    2013-04-04
  • 如何在 Spring Boot 中配置和使用 CSRF 保护

    如何在 Spring Boot 中配置和使用 CSRF 保护

    CSRF是一种网络攻击,它利用已认证用户的身份来执行未经用户同意的操作,Spring Boot 提供了内置的 CSRF 保护机制,可以帮助您防止这种类型的攻击,这篇文章主要介绍了Spring Boot 中的 CSRF 保护配置的使用方法,需要的朋友可以参考下
    2023-09-09
  • Java concurrency线程池之线程池原理(一)_动力节点Java学院整理

    Java concurrency线程池之线程池原理(一)_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Java concurrency线程池之线程池原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • IDEA创建SpringBoot的maven项目的方法步骤

    IDEA创建SpringBoot的maven项目的方法步骤

    这篇文章主要介绍了IDEA创建SpringBoot的maven项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Spring @Order注解使用详解

    Spring @Order注解使用详解

    注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响
    2022-08-08
  • centos上安装配置java WEB环境

    centos上安装配置java WEB环境

    前提是centos6.3系统已经安装好,在这里以64位系统为例,下面是jdk,tomcat,mysql下载安装步骤,有需要的小伙伴可以参考下
    2016-10-10
  • 使用Java和Ehcache实现缓存策略的设置及示例代码

    使用Java和Ehcache实现缓存策略的设置及示例代码

    本文介绍了如何使用Java和Ehcache实现缓存策略,包括基本配置、缓存策略的设置以及示例代码,感兴趣的朋友跟随小编一起看看吧
    2025-12-12

最新评论