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 多个时间区间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot使用validation进行自参数校验的方法

    SpringBoot使用validation进行自参数校验的方法

    在SpringBoot项目中,利用validation依赖可以通过注解方式校验数据库交互参数,提高代码可读性和维护性,此方法避免了硬编码校验规则,方便后期规则变更,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • 详细聊聊RabbitMQ竟无法反序列化List问题

    详细聊聊RabbitMQ竟无法反序列化List问题

    这篇文章主要给大家介绍了关于RabbitMQ竟无法反序列化List的相关资料,文中通过示例代码将问题以及解决的过程介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • JavaWeb实现文件上传与下载实例详解

    JavaWeb实现文件上传与下载实例详解

    在Web应用程序开发中,文件上传与下载功能是非常常用的功能,下面通过本文给大家介绍JavaWeb实现文件上传与下载实例详解,对javaweb文件上传下载相关知识感兴趣的朋友一起学习吧
    2016-02-02
  • 详解如何在Java中调用Python程序

    详解如何在Java中调用Python程序

    今天给大家带来的是关于Java中调用Python程序的相关知识,文章有非常详细的代码示例,需要的朋友可以参考下
    2021-06-06
  • Spring Boot项目中解决跨域问题的四种方式总结

    Spring Boot项目中解决跨域问题的四种方式总结

    这篇文章主要介绍了浏览器同源策略限制导致的跨域问题,并详细记录了常见的跨域解决方案,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • Springboot中动态语言groovy介绍

    Springboot中动态语言groovy介绍

    Apache的Groovy是Java平台上设计的面向对象编程语言,这门动态语言拥有类似Python、Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用,这篇文章主要介绍了springboot中如何使用groovy,需要的朋友可以参考下
    2022-09-09
  • Java使用GUI绘制线条的示例

    Java使用GUI绘制线条的示例

    这篇文章主要介绍了Java使用GUI绘制线条的示例,帮助大家更好的理解和学习java gui编程,感兴趣的朋友可以了解下
    2020-09-09
  • 基于Java实现简易的七星彩号码生成器

    基于Java实现简易的七星彩号码生成器

    七星彩是中国体育彩票的一种玩法,由中国国家体育总局体育彩票管理中心统一发行。本文为大家准备了一个七星彩号码生成器Java工具类,感兴趣的可以了解一下
    2022-08-08
  • springboot项目不输出nohup.out日志的解决

    springboot项目不输出nohup.out日志的解决

    这篇文章主要介绍了springboot项目不输出nohup.out日志的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java如何基于poi操作Wold工具类

    Java如何基于poi操作Wold工具类

    这篇文章主要介绍了Java如何基于poi操作Wold工具类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论