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; } } } } }
逻辑说明
- 去重检查:使用
HashSet存储学生已选课程名称,利用其O(1)的contains方法快速判断课程是否已选,避免遍历链表的低效操作。 - 循环分配:通过
while循环代替原有的固定3次循环,确保学生选满3门不重复的课程才停止分配。 - 双向同步:仅在课程未重复时,才同时更新学生的选课列表和课程的学生列表,保证两边数据一致且无重复。
修改后运行代码,每个学生的3门课程将无重复,课程的选课学生列表也不会出现重复的学生ID,符合预期输出要求。
内容的提问来源于stack exchange,提问作者Hamza Mohamed yaser
相关产品推荐
相关产品推荐

