package com.inmind.s_test_03; import java.util.*; /** * 学生管理系统 * 演示List、Set集合的使用,以及Comparator和Collections工具类的应用 */ public class StudentManager { public static final String COURSE_JAVA = "Java编程"; // 存储学生列表(使用List允许重复添加检测和有序访问) private List students; // 存储所有可选课程(使用Set确保课程不重复) private Set allCourses; /** * 构造方法,初始化集合 */ public StudentManager() { students = new ArrayList(); // 初始化学生列表 allCourses = new HashSet(); // 初始化课程集合 initData(); // 初始化测试数据 } /** * 初始化测试数据 */ private void initData() { // 添加课程 allCourses.add(COURSE_JAVA); allCourses.add("数据结构"); allCourses.add("计算机网络"); allCourses.add("数据库原理"); allCourses.add("操作系统"); // 添加学生1 Student s1 = new Student("2023001", "张三", 20); s1.addCourse("Java编程"); s1.addCourse("数据结构"); s1.setScore(85.5); students.add(s1); // 添加学生2 Student s2 = new Student("2023002", "李四", 21); s2.addCourse("Java编程"); s2.addCourse("数据库原理"); s2.setScore(92.0); students.add(s2); // 添加学生3 Student s3 = new Student("2023003", "王五", 19); s3.addCourse("计算机网络"); s3.addCourse("操作系统"); s3.setScore(78.5); students.add(s3); // 添加学生4 Student s4 = new Student("2023004", "赵六", 20); s4.addCourse("数据结构"); s4.addCourse("数据库原理"); s4.setScore(88.0); students.add(s4); } /** * 添加学生 * @param student 要添加的学生对象 * @return 添加成功返回true,已存在返回false */ public boolean addStudent(Student student) { // 检查学生是否已存在(依赖Student类重写的equals方法) if (!students.contains(student)) { students.add(student); return true; } return false; } /** * 显示所有学生信息 */ public void showAllStudents() { System.out.println("\n===== 所有学生信息 ====="); // 使用增强for循环遍历学生列表 for (Student student : students) { System.out.println(student); } } /** * 按条件排序并显示学生信息 * @param comparator 比较器,定义排序规则 * @param sortType 排序类型描述,用于输出显示 */ public void sortAndShowStudents(Comparator comparator, String sortType) { // 创建列表副本进行排序,避免修改原列表顺序 List sortedList = new ArrayList(students); // 使用Collections工具类进行排序 Collections.sort(sortedList, comparator); System.out.println("\n===== 按" + sortType + "排序的学生信息 ====="); // 遍历排序后的列表 for (Student student : sortedList) { System.out.println(student); } } /** * 根据学号查找学生 * @param id 要查找的学号 * @return 找到的学生对象,未找到返回null */ public Student findStudentById(String id) { // 创建列表副本并按学号排序(二分查找需要有序列表) List sortedById = new ArrayList(students); Collections.sort(sortedById, StudentComparator.byIdAsc()); // 使用Collections的binarySearch进行二分查找 int index = Collections.binarySearch(sortedById, new Student(id, "", 0), // 临时创建用于比较的学生对象 StudentComparator.byIdAsc()); // 使用学号比较器 // 索引>=0表示找到,返回对应学生对象 return index >= 0 ? sortedById.get(index) : null; } /** * 获取选修某门课程的所有学生 * @param course 课程名称 * @return 选修该课程的学生集合 */ public Set getStudentsByCourse(String course) { Set result = new HashSet(); // 遍历所有学生 for (Student student : students) { // 检查学生是否选修了该课程 if (student.getCourses().contains(course)) { result.add(student); } } return result; } /** * 计算学生平均年龄 * @return 平均年龄 */ public double getAverageAge() { if (students.isEmpty()) { // 学生列表为空时返回0 return 0; } int totalAge = 0; // 遍历所有学生,累加年龄 for (Student student : students) { totalAge += student.getAge(); } // 计算并返回平均年龄 return (double) totalAge / students.size(); } /** * 主方法,演示系统功能 * @param args 命令行参数 */ public static void main(String[] args) { // 创建学生管理系统实例 StudentManager manager = new StudentManager(); // 显示所有学生 manager.showAllStudents(); // 按不同条件排序并显示 manager.sortAndShowStudents(StudentComparator.byIdAsc(), "学号升序"); manager.sortAndShowStudents(StudentComparator.byNameAsc(), "姓名升序"); manager.sortAndShowStudents(StudentComparator.byScoreDesc(), "成绩降序"); manager.sortAndShowStudents(StudentComparator.byScoreDescAndNameAsc(), "成绩降序+姓名升序"); manager.sortAndShowStudents(StudentComparator.byAgeAsc(), "年龄升序"); // 查找指定学号的学生 String searchId = "2023002"; Student found = manager.findStudentById(searchId); System.out.println("\n查找学号为" + searchId + "的学生: " + (found != null ? found.getName() : "未找到")); // 查找选修特定课程的学生 String course = "Java编程"; Set javaStudents = manager.getStudentsByCourse(course); System.out.println("\n选修" + course + "的学生有" + javaStudents.size() + "人:"); // 使用迭代器遍历Set集合 Iterator iterator = javaStudents.iterator(); while (iterator.hasNext()) { Student student = iterator.next(); System.out.println(student.getName()); } // 统计并显示平均年龄 System.out.println("\n学生平均年龄: " + String.format("%.1f", manager.getAverageAge())); // 添加新学生 Student newStudent = new Student("2023005", "钱七", 22); newStudent.addCourse("操作系统"); newStudent.setScore(90.5); boolean added = manager.addStudent(newStudent); System.out.println("\n添加新学生" + newStudent.getName() + ": " + (added ? "成功" : "失败(已存在)")); // 再次显示所有学生,验证新学生是否添加成功 manager.showAllStudents(); } }