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

Python面向对象编程中课程冲突检测及代码优化方案咨询

课程冲突检测实现与代码优化建议

一、课程冲突检测功能实现

要实现冲突检测,核心是在添加课程时,将新课程与已添加的所有课程逐一对比:

1. 时间交集判断逻辑

你构思的集合交集方法可行,但用区间重叠的数学判断更高效,无需生成集合:
两个课程时间区间存在交集的条件是:
新课程.start_time < 已有课程.end_time 且 已有课程.start_time < 新课程.end_time
(默认课程时间为左闭右开,比如9-11表示覆盖9、10两个时段)

如果坚持用集合方法,修正代码如下:

# 生成课程覆盖的整点集合
time_set = set(range(course.start_time, course.end_time + 1))
# 与已有课程时间集合交集不为空则冲突
if time_set.intersection(existing_time_set):
    # 冲突处理逻辑

2. 完整冲突检测实现

在Schedule类的add_course方法中加入检测逻辑,每次添加新课程时自动校验:

def add_course(self, course):
    # 遍历已有课程检查冲突
    for existing_course in self.courses:
        if existing_course.day == course.day:
            # 判断时间区间是否重叠
            if course.start_time < existing_course.end_time and existing_course.start_time < course.end_time:
                print(f"冲突提示:课程「{course.name}」与已添加的「{existing_course.name}」在{course.day}时间重叠!")
                # 可选:禁止添加冲突课程,直接return
                # return
    # 无冲突则添加课程
    self.courses.append(course)

二、代码优化建议

1. 消除冗余代码

  • 删除__init__方法中未使用的program变量;
  • 将重复定义的工作日、时段列表抽为类常量,避免重复创建:
class Schedule:
    # 类常量:固定工作日与时段
    DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
    TIME_SLOTS = ["9", "10", "11", "12", "13", "14", "15", "16", "17"]
    
    def __init__(self):
        self.courses = []
    
    def print_schedule(self):
        # 初始化日程表结构
        program = [self.TIME_SLOTS.copy() for _ in self.DAYS]
        # 填充课程信息
        for course in self.courses:
            day_idx = self.DAYS.index(course.day)
            start_idx = course.start_time - 9
            end_idx = course.end_time - 9
            for j in range(start_idx, end_idx):
                course_info = f" | {course.name}({course.instructor} @ {course.classroom})"
                program[day_idx][j] += course_info
        # 格式化打印日程
        for day, slots in zip(self.DAYS, program):
            print(f"\n{day}:")
            for slot in slots:
                print(slot)

2. 增强类的可读性与调试性

给Course类添加__repr__方法,方便调试时查看课程信息:

class Course:
    def __init__(self, name, classroom, instructor, day, start_time, end_time):
        self.name = name
        self.classroom = classroom
        self.instructor = instructor
        self.day = day
        self.start_time = start_time
        self.end_time = end_time
    
    def __repr__(self):
        return f"Course(name='{self.name}', day='{self.day}', time={self.start_time}-{self.end_time})"

3. 输入合法性校验

在Course初始化方法中添加参数校验,避免无效输入:

def __init__(self, name, classroom, instructor, day, start_time, end_time):
    if start_time >= end_time:
        raise ValueError("课程结束时间必须晚于开始时间")
    valid_days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
    if day not in valid_days:
        raise ValueError(f"无效日期,必须是{valid_days}中的一个")
    # 其余初始化代码

4. 日程打印格式优化

原打印方式会导致时段字符串过长,改用分隔符分隔时段与课程信息,提升可读性(如上述优化后的print_schedule方法)。

内容的提问来源于stack exchange,提问作者4DescarTes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:15:27