java - 在课堂期刊中存储学生评估的最佳方式

时间:2017-06-17 13:00:00

标签: java oop

想象一下,你有一份学生评估期刊。有些日子,每个学生都会在日记中记录每个科目。是否有更好的方法在特定日期添加学生分数?

我尝试将这些数据存储在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;

    ...
}

使用创建/读取/更新/删除操作来存储这个更高效的任何想法?我很乐意获得如何组织这些课程的提示。

2 个答案:

答案 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)。

尽管如此,如果您愿意让您的数据结构的标记已经在具体学生上排序,我建议在StudentMark之间实现向后关系:

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. 更具描述性
  3. 您使用Java的一个主要功能 - 强类型。这意味着在编译时保证您的客户端代码不会接受任何非StudentPerformance类型的东西。它确实有助于避免大型项目中的错误。
  4. 最后,具体的解决方案始终取决于您的应用程序的需求。没有银弹。

答案 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;

    ...
}