我有很多学生,每个学生可能有很多科目,每个科目也可能有很多学生。现在,我想实现一个POJO结构:allStudentList
和allSubjectList
仅用于查询每种类型的所有元素。这个结构设计合理吗?有更好的选择吗?这是我的方法:
//THE Student class
public class Student {
//List with all students.
private static ArrayList<Student> allStudentList = new ArrayList<>();
//Student fields
private String id;
private String name;
//The subjects of Student
private ArrayList<Subject> subjectsList = new ArrayList<>();
public Student(String id, String subject) {
this.id = id;
this.name = subject;
allStudentList.add(this);
}
public boolean addSubject(Subject subject) {
subject.getStudentList().add(this);
return subjectsList.add(subject);
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
ArrayList<Subject> getSubjectsList() {
return subjectsList;
}
public void setSubjectsList(ArrayList<Subject> subjectsList) {
this.subjectsList = subjectsList;
}
public static Student[] getStudents() {
return allStudentList.toArray(new Student[allStudentList.size()]);
}
@Override
public String toString() {
String s = "";
for (Subject subject : subjectsList) {
s += "\n " + subject.getId() +" " +subject.getName();
}
return "Student{" + "id=" + id + ", name=" + name + ", subjectsList=" + s + '}';
}
//THE Subject class
public class Subject {
//List with all students.
private static ArrayList<Subject> allSubjectList = new ArrayList<>();
private String id;
private String name;
private ArrayList<Student> studentList = new ArrayList<>();
public Subject(String id, String name) {
this.id = id;
this.name = name;
allSubjectList.add(this);
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
ArrayList<Student> getStudentList() {
return studentList;
}
public boolean addStudent(Student student) {
student.getSubjectsList().add(this);
return studentList.add(student);
}
public static Subject[] getStudents() {
return allSubjectList.toArray(new Subject [allSubjectList.size()]);
}
@Override
public String toString() {
String s ="";
for (Student student : studentList) {
s +="\n "+student.getId() +" "+student.getName();
}
return "Subject{" + "id=" + id + ", nombre=" + name + ", studentList=" +s + '}';
}
//The test class:
public class TestMany2Many {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Student student0 = new Student("ST000", "Morty");
Student student1 = new Student("ST001", "Rick");
Subject subject0 = new Subject("SU000", "Physics");
Subject subject1 = new Subject("SU001", "Math");
student0.addSubject(subject0);
student0.addSubject(subject1);
student1.addSubject(subject0);
Student[] st = Student.getStudents();
Subject[] su = Subject.getStudents();
for (Subject subject : su) {
System.out.println("subject = " + subject);
}
for (Student student : st) {
System.out.println("student = " + student);
}
}
}
似乎您的学生班级也包含所有学生的列表。但是您要实例化它多次,这将创建多个列表。将其视为列表可能会有所帮助,并在名称“ Students”的末尾添加“ s”。然后实例化一次并将学生添加到其中。像
之类的东西Subjects subjectList = new Subjects();
Students studentList = new Students();
subjectList.setStudents(studentList);
studentList.addStudent(student1ID, student1Name);
studentList.addStudent(student2ID, student2Name);
studentList.getStudent(studentID).addSubject(subjectID);
或最后一行
studentList.addSubject(student1ID, subjectID);
subjectID必须存在于等效的Subjects
类中。
要跟踪多对多关系,如果可以的话,最好将数据保存在一个地方。否则,您实际上将拥有同一列表的两个副本。因此,与其将学生列表保留在subject对象内,不如可以通过students对象查询students对象以获得任何特定学科的学生列表。
public List<Student> getEnrolledStudents(String subjectID)
{
Students studentList = getStudentList();
return studentList.getStudentsEnrolledInSubject(subjectID);
}
搜索双向列表作为可能的解决方案。
学生对象可以直接找到任何学生正在修读的科目。
如果必须同时将数据放入两者中,则需要确保其以某种方式同步,因此删除学生将删除学科中的相关记录,反之亦然。这很快就会变得混乱,很可能是练习的重点。
祝你好运!