Files
javaSE1001/day01/src/com/inmind/s_test_03/StudentManager.java
2025-12-21 17:24:54 +08:00

211 lines
7.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<Student> students;
// 存储所有可选课程使用Set确保课程不重复
private Set<String> allCourses;
/**
* 构造方法,初始化集合
*/
public StudentManager() {
students = new ArrayList<Student>(); // 初始化学生列表
allCourses = new HashSet<String>(); // 初始化课程集合
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<Student> comparator, String sortType) {
// 创建列表副本进行排序,避免修改原列表顺序
List<Student> sortedList = new ArrayList<Student>(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<Student> sortedById = new ArrayList<Student>(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<Student> getStudentsByCourse(String course) {
Set<Student> result = new HashSet<Student>();
// 遍历所有学生
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<Student> javaStudents = manager.getStudentsByCourse(course);
System.out.println("\n选修" + course + "的学生有" + javaStudents.size() + "人:");
// 使用迭代器遍历Set集合
Iterator<Student> 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();
}
}