2017-06-17 26 views
1

想象一下,你有一個學生評估日記。每個學生在某一天的某個期刊中都有一些標題。有沒有更好的方法在特定日期添加學生的標記?java - 更好的方式來存儲學生評估類日記

我想這個數據存儲在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; 

    ... 
} 

任何想法,以創建/讀取/更新/刪除操作更有效地存儲這一個?我很樂意收到提示,我如何組織班級馬克或其他班級。

+1

你可能需要做進一步的抽象 –

回答

3

您的問題,最簡單的解決方案是有以下字段標誌類:

public class Mark { 

    private Integer value; 
    private Date date; 
    private Student student; 
    private Subject subject; 

    //getters & setters 
} 

這將允許得到一個具體學生的所有痕跡從任何Collection<Mark> marks使用過濾方法(谷歌番石榴庫提供這樣的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類型的代碼。它確實有助於避免大型項目中的錯誤。

最後,具體的解決方案總是取決於您的應用程序的需求。沒有銀彈。

+0

在OO方面,學生*有*標記。不需要'StudentPerformance'類,你現在正在考慮數據庫設計。 – NickL

+0

謝謝,我同意你的看法。這甚至是更好的解決方案來在學生中的變量中保存標記。我會編輯我的答案。 –

1

我不認爲在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; 

    ... 
}