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