init
This commit is contained in:
211
day01/src/com/inmind/s_test_03/StudentManager.java
Normal file
211
day01/src/com/inmind/s_test_03/StudentManager.java
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user