package com.studentmanagement.model; import com.studentmanagement.exception.DuplicateStudentException; import com.studentmanagement.exception.StudentNotFoundException; import java.util.*; import java.util.stream.Collectors; /** * 学生数据访问对象 * 负责学生数据的存储和访问操作,使用单例模式 */ public class StudentDAO { private static StudentDAO instance; private Map students; // 存储学生对象的集合 /** * 私有构造函数,防止外部实例化 */ private StudentDAO() { students = new HashMap<>(); // 添加一些示例数据 initSampleData(); } /** * 获取单例实例 * @return StudentDAO的唯一实例 */ public static synchronized StudentDAO getInstance() { if (instance == null) { instance = new StudentDAO(); } return instance; } /** * 初始化示例数据 */ private void initSampleData() { Student s1 = new Student("001", "张三", 20, "男"); s1.addCourseGrade("数学", 85.5); s1.addCourseGrade("英语", 92.0); s1.addCourseGrade("计算机", 88.5); Student s2 = new Student("002", "李四", 21, "女"); s2.addCourseGrade("数学", 90.0); s2.addCourseGrade("英语", 88.0); s2.addCourseGrade("计算机", 95.0); Student s3 = new Student("003", "王五", 19, "男"); s3.addCourseGrade("数学", 78.5); s3.addCourseGrade("英语", 82.0); s3.addCourseGrade("计算机", 80.0); try { addStudent(s1); addStudent(s2); addStudent(s3); } catch (DuplicateStudentException e) { // 示例数据初始化不应抛出重复异常 System.err.println("示例数据初始化错误: " + e.getMessage()); } } /** * 添加学生 * @param student 学生对象 * @throws DuplicateStudentException 如果学生ID已存在 */ public void addStudent(Student student) throws DuplicateStudentException { if (students.containsKey(student.getId())) { throw new DuplicateStudentException("学生ID已存在: " + student.getId(), student.getId()); } students.put(student.getId(), student); } /** * 获取所有学生 * @return 学生列表 */ public List getAllStudents() { return new ArrayList<>(students.values()); } /** * 根据ID查找学生 * @param id 学生ID * @return 学生对象 * @throws StudentNotFoundException 如果学生不存在 */ public Student getStudentById(String id) throws StudentNotFoundException { Student student = students.get(id); if (student == null) { throw new StudentNotFoundException("未找到ID为" + id + "的学生", id); } return student; } /** * 更新学生信息 * @param student 学生对象 * @throws StudentNotFoundException 如果学生不存在 */ public void updateStudent(Student student) throws StudentNotFoundException { if (!students.containsKey(student.getId())) { throw new StudentNotFoundException("未找到ID为" + student.getId() + "的学生", student.getId()); } students.put(student.getId(), student); } /** * 删除学生 * @param id 学生ID * @throws StudentNotFoundException 如果学生不存在 */ public void deleteStudent(String id) throws StudentNotFoundException { if (!students.containsKey(id)) { throw new StudentNotFoundException("未找到ID为" + id + "的学生", id); } students.remove(id); } /** * 根据课程筛选学生 * @param course 课程名称 * @return 选修该课程的学生列表 */ public List getStudentsByCourse(String course) { List result = new ArrayList<>(); for (Student student : students.values()) { if (student.getCourseGrades().containsKey(course)) { result.add(student); } } return result; } /** * 根据成绩范围筛选学生 * @param minGrade 最低成绩 * @param maxGrade 最高成绩 * @return 平均成绩在范围内的学生列表 */ public List getStudentsByGradeRange(double minGrade, double maxGrade) { List result = new ArrayList<>(); for (Student student : students.values()) { double avgGrade = student.calculateAverageGrade(); if (avgGrade >= minGrade && avgGrade <= maxGrade) { result.add(student); } } return result; } }