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

如何遍历HashMap比对会议对象时间并替换冲突的对应值

代码修正方案

核心逻辑说明

你不需要遍历整个HashMap的EntrySet查找目标日期,既然已经通过containsKey(meetingDate)判断日期存在,直接调用meetings.get(meetingDate)就能拿到当天的所有会议集合,性能更高。
时间重叠的判断规则:两个会议重叠的充要条件是 新会议开始时间早于已有会议的结束时间,且新会议结束时间晚于已有会议的开始时间。

前提假设

假设你的Meeting类已经实现了以下两个方法返回会议时间:

  • LocalTime getStartTime():返回会议当日开始时间
  • LocalTime getEndTime():返回会议当日结束时间
    如果你的时间是带时区的LocalDateTime类型,判断逻辑完全一致。

修正后的代码

Meeting meeting = extractMeeting(employeeId, requestLines[i], 
        officeStartTime, officeFinishTime, meetingSlotRequest1);

if (meeting == null) {
    // 这里可以加非法会议的处理逻辑,直接跳过后续流程
    return;
}

if (meetings.containsKey(meetingDate)) {
    // 直接获取当日会议集合,无需遍历全Map
    Set<Meeting> existingMeetings = meetings.get(meetingDate);
    Set<Meeting> nonOverlapMeetings = new HashSet<>();

    // 遍历筛选所有不重叠的会议
    for (Meeting m : existingMeetings) {
        // 时间不重叠的判断:已有会议结束早于新会议开始,或者已有会议开始晚于新会议结束
        boolean isNotOverlap = m.getEndTime().isBefore(meeting.getStartTime()) 
                || m.getStartTime().isAfter(meeting.getEndTime());
        if (isNotOverlap) {
            nonOverlapMeetings.add(m);
        }
    }

    // 加入新会议,替换当日的会议集合
    nonOverlapMeetings.add(meeting);
    meetings.put(meetingDate, nonOverlapMeetings);
} else {
    // 当日无会议,直接新增
    System.out.println("HERES3?");
    Set<Meeting> meetingsForDay = new HashSet<>();
    meetingsForDay.add(meeting);
    meetings.put(meetingDate, meetingsForDay);
}

原有代码问题修正点

  • 去掉了冗余的全Map EntrySet遍历逻辑,直接通过key获取对应集合,同时避免了用==比较LocalDate对象的错误(对象比较值需要用equals方法)
  • 修正了原有逻辑中只要当日有会议就清空所有会议的错误,仅删除和新会议重叠的条目
  • 提前判断meeting为空的情况,避免空指针异常

内容的提问来源于stack exchange,提问作者A. Nabeen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:15:02