diff --git a/src/main/java/me/lensfrex/manager/data/ManagerTool.java b/src/main/java/me/lensfrex/manager/data/ManagerTool.java index 3ed951d..1b7d744 100644 --- a/src/main/java/me/lensfrex/manager/data/ManagerTool.java +++ b/src/main/java/me/lensfrex/manager/data/ManagerTool.java @@ -1,6 +1,8 @@ package me.lensfrex.manager.data; import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; import java.util.Map; public class ManagerTool { @@ -10,8 +12,108 @@ public class ManagerTool { this.studentData = studentData; } + /** + * 添加一个学生 + * + * @param id 学生id,long格式 + * @param name 学生姓名 + * @param score 学生成绩,map中key为科目名称,value为相应的成绩 + */ public void addStudent(long id, String name, Map score) { + Student student = new Student(id, name, score); + studentData.add(student); + } + + /** + * 按名字查找学生 + * + * @param name 学生姓名 + * @return 学生的信息,若无该学生则返回null + */ + public Student getStudent(String name) { + for (Student student : studentData) { + if (student.getName().equals(name)) { + return student; + } + } + + return null; + } + + /** + * 按学号查找学生 + * + * @param id 学生学号 + * @return 学生信息,若无该学生则返回null + */ + public Student getStudent(long id) { + for (Student student : studentData) { + if (student.getId() == id) { + return student; + } + } + + return null; + } + + public static final int SORT_COMPARE_BY_NAME = 0; + public static final int SORT_COMPARE_BY_ID = 1; + public static final int SORT_COMPARE_BY_GENERAL_SCORE = 2; + + /** + * 对学生列表进行排序 + * + * @param compareMethod 排序方式,可根据名字字典顺序(升序,0)、学生学号(升序,1)以及总成绩(降序,2)进行排序。 + * @return 排序后的学生列表 + */ + public ArrayList getSortedStudentList(int compareMethod) { + ArrayList sortedStudentList = new ArrayList<>(studentData); + switch (compareMethod) { + case SORT_COMPARE_BY_NAME: + sortedStudentList.sort(Student.compareByName); + break; + case SORT_COMPARE_BY_ID: + sortedStudentList.sort(Student.compareById); + break; + case SORT_COMPARE_BY_GENERAL_SCORE: + sortedStudentList.sort(Student.compareByGeneralScore); + break; + default: + break; + } + return sortedStudentList; + } + /** + * 获取全班某课程的成绩信息 + * + * @param subject 欲获取的科目信息 + * @return 包含成绩信息的HashMap,key为学生姓名,value为该科成绩数据 + */ + public HashMap getSubjectScores(String subject) { + HashMap scores = new HashMap<>(); + for (Student student : studentData) { + scores.put(student.getName(), student.getScore().get(subject)); + } + return scores; } + /** + * 获取全班所有同学的总成绩信息 + * + * @return 包含全班所有同学成绩的HashMap,key为姓名,value为总成绩数据 + */ + public HashMap getStudentScores() { + HashMap result = new HashMap<>(); + + int scoreSum = 0; + for (Student student : studentData) { + for (int score : student.getScore().values()) { + scoreSum += score; + } + result.put(student.getName(), scoreSum); + scoreSum = 0; + } + return result; + } } diff --git a/src/main/java/me/lensfrex/manager/data/Student.java b/src/main/java/me/lensfrex/manager/data/Student.java index 2dcd987..fdfa10f 100644 --- a/src/main/java/me/lensfrex/manager/data/Student.java +++ b/src/main/java/me/lensfrex/manager/data/Student.java @@ -1,10 +1,13 @@ package me.lensfrex.manager.data; +import java.io.Serializable; +import java.util.Comparator; import java.util.Map; -public class Student { +public class Student implements Serializable { private String name; //private String id; + // 改用long是因为方便排序 :) private long id; private Map score; @@ -32,9 +35,24 @@ public class Student { this.score = score; } - public Student(String name, long id, Map score) { - this.name = name; + public Student(long id, String name, Map score) { this.id = id; + this.name = name; this.score = score; } + + public static Comparator compareByName = (s1, s2) -> s1.getName().compareTo(s2.getName()); + public static Comparator compareById = (s1, s2) -> (int) (s1.id - s2.id); + public static Comparator compareByGeneralScore = (s1, s2) -> { + int student1GeneralScore = 0, student2GeneralScore = 0; + for (int score : s1.getScore().values()) { + student1GeneralScore += score; + } + + for (int score : s2.getScore().values()) { + student2GeneralScore += score; + } + + return student1GeneralScore - student2GeneralScore; + }; } diff --git a/src/main/java/me/lensfrex/manager/data/StudentManager.java b/src/main/java/me/lensfrex/manager/data/StudentManager.java index 834a1c9..70d61bd 100644 --- a/src/main/java/me/lensfrex/manager/data/StudentManager.java +++ b/src/main/java/me/lensfrex/manager/data/StudentManager.java @@ -5,6 +5,7 @@ import java.util.ArrayList; public class StudentManager { private ArrayList studentData = new ArrayList<>(); + public void addStudent() { - + } } diff --git a/src/main/java/me/lensfrex/manager/utils/DataLoader.java b/src/main/java/me/lensfrex/manager/utils/DataLoader.java new file mode 100644 index 0000000..bf9e452 --- /dev/null +++ b/src/main/java/me/lensfrex/manager/utils/DataLoader.java @@ -0,0 +1,43 @@ +package me.lensfrex.manager.utils; + +import me.lensfrex.manager.data.Student; + +import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; +import java.io.ObjectInputStream; +import java.util.ArrayList; + +/** + * 参考自以前的项目: + * https://github.com/lensferno/dogename/blob/main/Dogename/src/main/java/me/lensferno/dogename/data/History.java + */ +public class DataLoader { + private static final String DATA_FILE = "files/students.data"; + + /**\ + * 从默认路径(files/student.data)加载学生数据,若文件不存在或读取过程中发生错误,则新建一个空的ArrayList + * @return 加载读取的结果,若文件不存在或读取过程中发生错误,则返回一个空的ArrayList + */ + public ArrayList load() { + File historyFile = new File(DATA_FILE); + try { + if (!historyFile.exists()) { + historyFile.getParentFile().mkdirs(); + historyFile.createNewFile(); + return new ArrayList<>(); + } + + ObjectInputStream ois = new ObjectInputStream(new FileInputStream(historyFile)); + ois.close(); + return (ArrayList) ois.readObject(); + } catch (EOFException e) { + System.out.println("Data file is empty."); + return new ArrayList<>(); + } catch (Exception e) { + System.out.println("Failed to load data file:" + e); + e.printStackTrace(); + return new ArrayList<>(); + } + } +}