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

Java课程分配系统输出异常:重复选课与学生ID重复问题排查

解决Java课程分配系统的重复选课问题

问题根源

当前代码的assignCoursesToStudents方法在随机分配课程时,未检查学生是否已选过该课程——直接生成随机课程ID就执行分配,导致同一个学生可能被重复分配同一门课,同时课程的选课学生列表也会重复添加同一学生ID。

解决方案

修改assignCoursesToStudents方法,新增重复检查逻辑:给每个学生维护已选课程的集合,确保每次分配的课程都是学生未选过的,直到选满3门不重复的课程为止。

修改后的代码

首先在sys类顶部导入所需工具类:

import java.util.HashSet;
import java.util.Set;

替换原有的assignCoursesToStudents方法:

public void assignCoursesToStudents() {
    for (Node student : students) {
        // 用HashSet记录学生已选课程,快速判断重复
        Set<String> enrolledCourses = new HashSet<>();
        // 循环直到选够3门不重复课程
        while (enrolledCourses.size() < 3) {
            int courseId = (int) (Math.random() * courses.length);
            Node targetCourse = courses[courseId];
            String courseName = targetCourse.name;
            
            // 仅当学生未选过该课程时,执行分配操作
            if (!enrolledCourses.contains(courseName)) {
                enrolledCourses.add(courseName);
                
                // 向学生的选课列表添加课程
                Node courseNode = new Node(courseName);
                if (student.down == null) {
                    student.down = courseNode;
                } else {
                    Node currentCourse = student.down;
                    while (currentCourse.next != null) {
                        currentCourse = currentCourse.next;
                    }
                    currentCourse.next = courseNode;
                }
                
                // 向课程的选课学生列表添加学生
                Node studentNode = new Node(student.id);
                if (targetCourse.down == null) {
                    targetCourse.down = studentNode;
                } else {
                    Node temp = targetCourse.down;
                    while (temp.next != null) {
                        temp = temp.next;
                    }
                    temp.next = studentNode;
                }
            }
        }
    }
}

逻辑说明

  1. 去重检查:使用HashSet存储学生已选课程名称,利用其O(1)的contains方法快速判断课程是否已选,避免遍历链表的低效操作。
  2. 循环分配:通过while循环代替原有的固定3次循环,确保学生选满3门不重复的课程才停止分配。
  3. 双向同步:仅在课程未重复时,才同时更新学生的选课列表和课程的学生列表,保证两边数据一致且无重复。

修改后运行代码,每个学生的3门课程将无重复,课程的选课学生列表也不会出现重复的学生ID,符合预期输出要求。

内容的提问来源于stack exchange,提问作者Hamza Mohamed yaser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:13:17