You need to enable JavaScript to run this app. Android Studio Java环境下如何校验同JSON内课程安排的课时重叠问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 02:45:04