如何遍历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
相关产品推荐
相关产品推荐

