Android Studio Java环境下如何校验同JSON内课程安排的课时重叠问题
校验规则设计
- 前置判断:只有
day字段相同的课程才可能出现课时重叠,不同天的课程直接跳过比对 - 时间统一转换:将课程的开始、结束时间统一转换为当日总分钟数(例如8:10转换为8*60+10=490),避免时分分开比对的逻辑复杂度
- 重叠判定逻辑:满足
课程A开始分钟数 < 课程B结束分钟数 且 课程A结束分钟数 > 课程B开始分钟数即判定为重叠,该规则覆盖所有重叠场景:课程互相包含、首尾部分重叠、其中一个完全落在另一个区间内注:如果A的结束时间刚好等于B的开始时间,不属于重叠,不会被统计
实现步骤与代码
步骤1:JSON解析为实体类
首先将你的JSON字符串解析为对应的实体对象,推荐使用Gson实现,先定义JSON对应的外层响应类:
public class TimetableResp { private List<Sticker> sticker; public List<Sticker> getSticker() { return sticker; } }
解析代码如下:
// yourJsonStr替换为你实际的JSON字符串 TimetableResp resp = new Gson().fromJson(yourJsonStr, TimetableResp.class); List<Sticker> stickerList = resp.getSticker();
步骤2:提取全量课程列表
将所有Sticker里的Schedule合并到同一个列表中方便比对:
List<Schedule> allSchedules = new ArrayList<>(); for (Sticker sticker : stickerList) { allSchedules.addAll(sticker.getSchedules()); }
步骤3:重叠课程检测
// 存储重叠课程对,用i<j的遍历方式避免[A,B]和[B,A]重复统计 List<Pair<Schedule, Schedule>> overlapList = new ArrayList<>(); int total = allSchedules.size(); for (int i = 0; i < total; i++) { Schedule s1 = allSchedules.get(i); int s1Day = s1.getDay(); int s1StartMin = timeToMinute(s1.getStartTime()); int s1EndMin = timeToMinute(s1.getEndTime()); for (int j = i + 1; j < total; j++) { Schedule s2 = allSchedules.get(j); // 不同天直接跳过 if (s1Day != s2.getDay()) { continue; } int s2StartMin = timeToMinute(s2.getStartTime()); int s2EndMin = timeToMinute(s2.getEndTime()); // 重叠判定 if (s1StartMin < s2EndMin && s1EndMin > s2StartMin) { overlapList.add(new Pair<>(s1, s2)); } } }
步骤4:重叠课程信息输出
// 遍历输出所有重叠课程的完整信息 for (Pair<Schedule, Schedule> pair : overlapList) { Schedule s1 = pair.first; Schedule s2 = pair.second; System.out.println("===== 检测到重叠课程 ====="); System.out.println("课程1:" + s1.getClassTitle() + " | 地点:" + s1.getClassPlace() + " | 老师:" + s1.getProfessorName() + " | 周" + getDayCn(s1.getDay()) + " | 时间:" + formatTime(s1.getStartTime()) + "-" + formatTime(s1.getEndTime())); System.out.println("课程2:" + s2.getClassTitle() + " | 地点:" + s2.getClassPlace() + " | 老师:" + s2.getProfessorName() + " | 周" + getDayCn(s2.getDay()) + " | 时间:" + formatTime(s2.getStartTime()) + "-" + formatTime(s2.getEndTime())); } // 以下是工具方法 // Time转当日分钟数 private int timeToMinute(Time time) { return time.getHour() * 60 + time.getMinute(); } // 数字星期转中文 private String getDayCn(int day) { switch (day) { case 0: return "一"; case 1: return "二"; case 2: return "三"; case 3: return "四"; case 4: return "五"; case 5: return "六"; case 6: return "日"; default: return "未知"; } } // 格式化时间为HH:mm格式 private String formatTime(Time time) { return String.format("%02d:%02d", time.getHour(), time.getMinute()); }
你提供的示例JSON中的三个课程分别在周五、周一、周三,无重叠场景,运行后不会输出结果,可以自行添加同天重叠的测试数据验证逻辑正确性。如果使用Android环境,可将
System.out.println替换为Log.d输出日志即可。
内容的提问来源于stack exchange,提问作者YYL
相关产品推荐
相关产品推荐

