This commit is contained in:
2025-12-21 17:24:54 +08:00
commit e8c50a3d78
660 changed files with 29599 additions and 0 deletions

View File

@@ -0,0 +1,211 @@
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();
}
}