想象一下,你有一份学生评估期刊。有些日子,每个学生都会在日记中记录每个科目。是否有更好的方法在特定日期添加学生分数?
我尝试将这些数据存储在HashMap<Student, HashMap<Subject, ArrayList<Integer>>>
(我以前的 question )中,但我认为这种方式很笨,效率不高。
class School {
private List<Classes> classes;
...
}
/**
* Classes contains data of school classes (students, subjects etc)
*/
class Classes {
private List<Students> students;
private List<Subjects> subjects;
private List<Teachers> teachers;
...
}
/**
* Class Mark is a collection of student marks
* Contains Mark, Subject and Date values
*/
class Mark {
private Date date;
...
}
使用创建/读取/更新/删除操作来存储这个更高效的任何想法?我很乐意获得如何组织这些课程的提示。
答案 0 :(得分:3)
解决问题的最简单方法是让Mark类包含以下字段:
public class Mark {
private Integer value;
private Date date;
private Student student;
private Subject subject;
//getters & setters
}
这将允许使用过滤方法从任何Collection<Mark> marks
获取具体学生的所有分数(谷歌guave libs提供这样的API,使用Java 8,它现在更容易做,因为它现在在java.util.stream
)。
尽管如此,如果您愿意让您的数据结构的标记已经在具体学生上排序,我建议在Student
和Mark
之间实现向后关系:
public class Student {
private Collection<Mark> marks;
//getters & setters
}
现在你对Collection<Student> students
进行操作,并且可以从该系列中获得具体学生的分数。
最后,如果您希望对已经按照学生和主题排序的标记的数据结构进行操作,您可以使用其他抽象:
public class StudentPerformance {
private Student student;
private Map<Subject, List<Mark>> marks; //actually it can be implemented
//with a class as well but let's leave it as it is
//for the sake of simplicity of the example
//setters & getters
}
然后将其存储为集合:Collection<StudentPerformance> performances
这种解决方案的优点:
最后,具体的解决方案始终取决于您的应用程序的需求。没有银弹。
答案 1 :(得分:2)
我不认为在HashMap中使用复杂的密钥是个好主意。
我会做这样的事情:
class Evaluation {
private Subject Subject;
private Date date;
private List<Mark> marks;
//getters & setters
}
class Mark {
Student student;
int score;
//getters & setters
}
所以现在在课程中你会有:
class Classes {
private List<Students> students;
private List<Subjects> subjects;
private List<Teachers> teachers;
private List<Evaluation> evaluations;
...
}