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基础(System.err和System.out)详解

    java基础(System.err和System.out)详解

    下面小编就为大家带来一篇java基础(System.err和System.out)详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java guava主要功能介绍及使用心得总结

    java guava主要功能介绍及使用心得总结

    这篇文章主要为大家介绍了java guava主要功能介绍及使用心得总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java及数据库对日期进行格式化方式

    Java及数据库对日期进行格式化方式

    这篇文章主要介绍了Java及数据库对日期进行格式化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot之ApplicationRunner解析(spring容器启动完成执行的类)

    SpringBoot之ApplicationRunner解析(spring容器启动完成执行的类)

    这篇文章主要介绍了SpringBoot之ApplicationRunner解析(spring容器启动完成执行的类),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • java图搜索算法之DFS与BFS详解

    java图搜索算法之DFS与BFS详解

    这篇文章主要为大家介绍了java数据结构中可以秒杀一切图算法的DFS与BFS作用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • 一文读懂ava中的Volatile关键字使用

    一文读懂ava中的Volatile关键字使用

    volatile关键字的作用保证了变量的可见性(visibility)。被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。这篇文章主要介绍了ava中的Volatile关键字使用,需要的朋友可以参考下
    2020-03-03
  • 详解Java如何给按钮添加监视器

    详解Java如何给按钮添加监视器

    这篇文章主要介绍了详解Java如何给按钮添加监视器,使用匿名对象、实现接口、实现类、Lambda表达式、注解等,需要的朋友可以参考下
    2023-04-04
  • Java List排序4种写法整理

    Java List排序4种写法整理

    这篇文章主要给大家介绍了关于Java List排序4种写法整理的相关资料,在有的时候我们会需要对List进行排序,在Java中如何实现呢,本文记录一下Java中对List的几种排序方式,需要的朋友可以参考下
    2023-08-08
  • Java多线程之readwritelock读写分离的实现代码

    Java多线程之readwritelock读写分离的实现代码

    这篇文章主要介绍了Java多线程之readwritelock读写分离的相关内容,文中涉及具体实例代码,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java实现克鲁斯卡尔算法的示例代码

    Java实现克鲁斯卡尔算法的示例代码

    克鲁斯卡尔算法是一种用于求解最小生成树问题的贪心算法。这篇文章主要为大家详细介绍了Java实现克鲁斯卡尔算法的方法,需要的可以参考一下
    2023-04-04

最新评论