You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:10:30