For循环无法向ArrayList添加元素?预约系统医生分配失败排查
问题分析与修复方案
核心问题
你的availableDoctors列表始终为空,根源在于**isAvailable方法的参数传递错误**、时间段重叠判断逻辑不完整,以及方法内的逻辑顺序混乱。
1. 参数传递错误
主逻辑循环中,你传入selectedDoctor作为isAvailable的第一个参数,但实际需要传入当前遍历的doc——因为你要检查的是当前循环的这位医生在目标时段是否可用,而非始终以最初选中的医生为判断基准。
2. 时间段重叠判断不完整
当前时间判断仅覆盖了“预约开始/结束时间落在已有预约区间内”的场景,漏掉了以下常见重叠情况:
- 当前预约完全包含已有预约
- 当前预约被已有预约完全包含
- 当前预约的开始时间与已有预约的结束时间重合(或反之,需根据业务规则调整)
3. 医生匹配逻辑顺序错误
isAvailable方法中先检查时间重叠、再判断医生是否匹配的逻辑完全颠倒:只要存在任意一个预约的医生与传入医生相同,就直接返回false,完全忽略了时间是否冲突的判断。
修复后的代码
1. 修正主逻辑的参数传递
将传入的selectedDoctor替换为当前遍历的doc,同时补充随机分配的核心逻辑:
if (dateMatcher.matches() && timeMatcher.matches()) { // ...省略部分代码 else { List<Doctor> availableDoctors = new ArrayList<>(); int duration = Integer.parseInt(hourCountInput); for (Doctor doc : doctorArrayList) { // 修正:传入当前遍历的医生,而非选中的医生 if (doc.isAvailable(doc, ldt, duration, Consultation.getConsultationList())) { availableDoctors.add(doc); } } // 补充随机分配逻辑 if (!availableDoctors.isEmpty()) { Random random = new Random(); Doctor assignedDoctor = availableDoctors.get(random.nextInt(availableDoctors.size())); // 执行后续预约创建逻辑 } } }
2. 重写isAvailable方法
修正逻辑顺序,完善时间段重叠判断:
public boolean isAvailable(Doctor currentDoctor, LocalDateTime startTime, int duration, List<Consultation> consultationList) { LocalDateTime endTime = startTime.plusHours(duration); for (Consultation consultation : consultationList) { // 跳过不属于当前医生的预约,只检查该医生的时段冲突 if (!currentDoctor.equals(consultation.getDoctor())) { continue; } LocalDateTime consStart = consultation.getDateTime(); LocalDateTime consEnd = consStart.plusHours(consultation.getHourCount()); // 标准时间段重叠判断:两个区间有交集即判定冲突 boolean isOverlap = startTime.isBefore(consEnd) && endTime.isAfter(consStart); if (isOverlap) { return false; } } return true; }
关键说明
- 参数修正:确保每个医生都在检查自身的时段可用性,而非固定校验选中医生的状态。
- 时间重叠判断:
startTime.isBefore(consEnd) && endTime.isAfter(consStart)是覆盖所有重叠场景的标准写法,避免遗漏。 - 逻辑优化:先过滤非当前医生的预约,减少无效判断,提升代码效率。
完成上述修改后,availableDoctors列表会正确收集所有可用医生,随机分配功能即可正常工作。
内容的提问来源于stack exchange,提问作者Yasiru Ruwantha Weerakoon
相关产品推荐
相关产品推荐

