如何实现判断导师已注册活动与指定活动是否重叠的校验方法?
问题排查与修复方案
你的代码目前存在两个核心问题,导致无法正确判断活动重叠:
1. 遍历范围错误
你当前的代码遍历了所有导师的活动列表,但需求是判断当前导师已注册的活动是否和新活动重叠。遍历所有导师完全不符合你的业务逻辑,应该只检查当前导师自己的活动。
2. 重叠判断逻辑不完整
你的判断条件只覆盖了「已有活动的开始/结束时间落在新活动区间内」这两种部分重叠的情况,漏掉了两种关键场景:
- 新活动完全被已有活动包含(比如已有活动13:00-17:00,新活动14:00-16:00)
- 已有活动完全被新活动包含(比如已有活动14:00-16:00,新活动13:00-17:00)
修复后的代码
假设这个方法是Tutor类的成员方法,修复后的代码如下:
public boolean overlap(Event event) { // 只遍历当前导师自己的活动 for (Event e : this.getEvents()) { // 先确认两个活动在同一天 if (e.getDate().equals(event.getDate())) { // 核心重叠判断逻辑:只要两个时间区间有交集就返回true // 逻辑:新活动开始时间早于已有活动结束时间,且新活动结束时间晚于已有活动开始时间 boolean hasOverlap = event.getStartTime().isBefore(e.getEndTime()) && event.getEndTime().isAfter(e.getStartTime()); if (hasOverlap) { return true; // 找到重叠直接返回,无需继续遍历 } } } return false; }
逻辑说明
这个判断条件可以覆盖所有重叠场景:
- 部分重叠:比如已有14:00-16:30,新活动13:00-15:00 → 满足
新start < 已有end且新end > 已有start - 完全包含(两种方向):不管是新活动被已有活动包含,还是反过来,都满足上述条件
- 无重叠:比如已有14:00-16:00,新活动16:00-18:00 →
新start不小于已有end,条件不成立
边界时间的特殊处理
如果你的需求中,边界时间相等算重叠(比如已有活动16:30结束,新活动16:30开始),可以把判断条件改成:
boolean hasOverlap = event.getStartTime().isBeforeOrEqual(e.getEndTime()) && event.getEndTime().isAfterOrEqual(e.getStartTime());
内容的提问来源于stack exchange,提问作者user3740970
相关产品推荐
相关产品推荐

