1

我有很多学生,每个学生可能有很多科目,每个科目也可能有很多学生。现在我想实现一个 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);
        }


    }

}
4

1 回答 1

1

您的 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类中。

为了跟踪多对多关系,如果可以的话,最好将数据保存在一个地方。否则,您将基本上拥有同一个列表的两个副本。因此,与其将学生列表保留在学科对象中,学科对象可以查询学生对象以获取学习任何特定学科的学生列表。

public List<Student> getEnrolledStudents(String subjectID)
{
    Students studentList = getStudentList();
    return studentList.getStudentsEnrolledInSubject(subjectID);
}

搜索双向列表作为可能的解决方案。

学生对象将能够直接找到任何学生正在学习的科目。

如果您必须将数据放入两者中,则需要确保其以某种方式同步,以便删除学生将删除科目中的关联记录,反之亦然。这很快就会变得一团糟,很可能是练习的重点。

祝你好运!

于 2019-11-17T13:49:27.410 回答