判断时间是否交叉交集的有趣的快速简单比较方法

在开发时,遇到这么一个需求,提交的数据中,有列表,列表中的每个元素开始时间和结束时间,假设我们定义这样的类如下

public class Interval {  
    private Long startTime;  
    private Long endTime;  
    
    // ... 省略get、set方法
}

在这里插入图片描述
要求任意时间段不能有交叉,即互相比较任意两个时间段不能有交集。于是开始思考,脑子里第一个想法,思考哪些情况可能会产生交集
在这里插入图片描述
想了下有这么几种可能,上面还忽略了等于的情况,只要判定是否符合这几种情况即存在交集然后抛错

1.startTime2<endTime1&&endTime2>endTime1

2.endTime2>startTime1&&endTime2<endTime1

3.startTime2>startTime1&&endTime2<endTime1

4.startTime1<startTime2&&endTime1<endTime2

这四个条件都是或的关系,写起来就是一长串,这也有点太复杂了吧,有没有简单点的思路呢?还真有,不要去想有交集的情况,去想下没交集的情况,然后取反不就好了吗?
在这里插入图片描述
即满足下面条件,不存在交集

endTime1<startTime2 || endTime2<startTime1 

那存在交集不就是

endTime1>=startTime2 && endTime2>=startTime1 

调整下顺序即为

if(startTime1<=endTime2 && startTime2<=endTime1){
	throw new BussinessException("时间存在交集");
}

感觉这个思考很有趣,记录一下,很多时候直接正面去想可能会很复杂,但如果反过来想,逆向思维可能就很简单!

如果您对技术有兴趣,友好交流,可以加v进技术群一起沟通,v:zzs1067632338,备注csdn即可

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值