假设您有一本学生评价日志。某天,每个学生在日记中都有每个科目的一些分数。有没有更好的方法来按特定日期添加学生的分数?
我试图将此数据存储在 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;
...
}
有什么想法可以通过创建/读取/更新/删除操作更有效地存储这个吗?我很乐意获得有关如何组织这些类(class)的提示。
最佳答案
解决您问题的最简单方法是让 Mark 类具有以下字段:
public class Mark {
private Integer value;
private Date date;
private Student student;
private Subject subject;
//getters & setters
}
这将允许从任何 Collection<Mark> marks
中获取具体学生的所有分数使用过滤方法(google guave 库提供了这样的 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
这种解决方案的优点:
- 减少客户端代码的冗长
- 更具描述性
- 您使用了 Java 的主要功能之一 - 强类型。这意味着在编译时保证您的客户端代码不会接受任何非 StudentPerformance 类型的内容。它确实有助于避免大型项目中的错误。
最后,具体的解决方案始终取决于您的应用程序的需求。没有 Elixir 。
关于java - 在类日志中存储学生评价的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44604926/