求时间段的交集并打印

创建自定义类

import lombok.Data;

import java.time.DateTimeException;

/**
 * @author Amid
 */
@Data
public class TimeCompar {
    private Long start;
    private Long end;

    public TimeCompar(Long start , Long end){
        if(end.compareTo(start) < 0){
            //抛异常
            throw new DateTimeException("结束时间不能小于开始时间");
        }
        this.start = start;
        this.end = end;
    }
}

测试类


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author Amid
 */
public class Demo {

    public static void main(String[] args) throws ParseException {
        List<String> list = new ArrayList<>();
        list.add("beginTime:2020-01-01 00:04:00,endTime:2020-01-01 00:06:00");
        list.add("beginTime:2020-01-01 00:01:05,endTime:2020-01-01 00:03:15");
        list.add("beginTime:2020-01-01 00:09:00,endTime:2020-01-01 00:10:00");
        list.add("beginTime:2020-01-01 00:05:00,endTime:2020-01-01 00:08:00");
        List<TimeCompar> timePairList = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            //拿到一个时间串
            String str = list.get(i);
            //先用 , 切割开
            String[] startAndEnd = str.split(",");
            //现在分别得到了开始时间和结束时间字符串,将具体时间截取出来
            //首先要知道:所在的位置,然后将:后的字符串截取出来
            int indexStart = startAndEnd[0].indexOf("2");
            String start = startAndEnd[0].substring(indexStart);
            int indexEnd = startAndEnd[1].indexOf("2");
            String end = startAndEnd[1].substring(indexEnd);
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date startDate = simpleDateFormat.parse(start);
            Date endDate = simpleDateFormat.parse(end);
            TimeCompar timeCompar = new TimeCompar(startDate.getTime(),endDate.getTime());
            timePairList.add(timeCompar);
        }
        //这样结束后timePairList中存的就是所有的起始时间对象,如果这个List为null或者无参数
        //调用list集合的sort方法,给定排序规则进行排序
        /* Comparator.comparingLong方法接受一个函数作为参数,该参数从类型T中提取一个长排序键,
         * 然后返回一个与该排序键进行比较的Comparator。指定的函数也可以序列化。
         */
        timePairList.sort(Comparator.comparingLong(TimeCompar::getStart));
        //排好序之后遍历比较,如果后一个的开始时间小于前一个的结束时间就说明有交集,将交集时间段打印
        for (int i = 1; i < timePairList.size(); i++) {
            Long nextStart = timePairList.get(i).getStart();
            Long lastEnd = timePairList.get(i - 1).getEnd();
            if(lastEnd > nextStart){
                //说明有交集,打印交集时间段,为下一个的开始---前一个的结束
                System.out.println("beginTime:" +
                        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
                                format(new Date(nextStart)) +
                        ",endTime:" +
                        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
                                format(new Date(lastEnd)));
            }
        }
    }

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值