我正在用Java编写一个程序,它应该像学生管理部门一样,有不同的学生,科目,教师等等。该计划应包括每个学生的一个一般主题列表和一个主题列表。问题在于,当我创建两个不同的主题并将其添加到一般主题列表中,然后找到一个并将其添加到学生主题列表中时,学生主题列表包含这两个主题。
我在网上搜索过,但要知道要找什么并不容易!
我自己写的是数据结构。
我的代码看起来像这样:
public class Subject() {
Subject next;
//constructor with parameters
}
public class Subjectlist() {
private Subject first;
//methods for adding to list, deleting, find and so on
}
public class Participation {
Subjectlist subjects;
public Participation() {
subjects = new Subjectlist();
}
}
public class Student() {
Participation participation;
public Student(paramters) {
participation = new Participation();
}
public class mainclass() {
public static void main(String [] args) {
Subjectlist subjectlist = new Subjectlist();
Studentlist students = new Studentlist();
Student student = new Student(parameters);
students.addToList(student);
Subject subject1 = new Subject(parameters);
Subject subject2 = new Subject(parameters);
subjectlist.addToList(subject1);
subjectlist.addToList(subject2);
Subject subject = subjectlist.find(subjectid); //Finds the subject with an ID given in the constructor
student.participation.subjects.addToList(subject);
//Now student.participation.subjects contains both subject1 and subject2
}
}
非常感谢任何帮助!
修改
这是find和addToList方法:
public String addToList(Subject new) {
Subject pointer = first; //Subject first is declared in the class
if(new == null) {
return "The subject was not added.";
}
else if (first == null) {
first = new;
return "The subject was added";
}
else {
while ( pointer.next != null )
pointer = pointer.next;
pointer.next = new;
return "The subject was added";
}
}
public Subject find(String subjectid) {
Subject found = null;
Subject pointer = first;
while (pointer != null) {
if (pointer.getSubjectID().equals(subjectid)) {
found = pointer;
}
pointer = pointer.next;
}
return found;
}
答案 0 :(得分:3)
我们真的需要剩下的代码来确认问题是什么,但是根据您发布的内容,我会采取有根据的猜测:
当您实现自己的链接列表时,该实现已泄漏到Subject类:
public class Subject() {
Subject next;
//constructor with parameters
}
此处 - 您创建的任何主题实例,如果它是列表的一部分,它将保存对链接列表中下一个项目的引用。
例如,在您发布的代码中:
Subject subject1 = new Subject(parameters);
Subject subject2 = new Subject(parameters);
subjectlist.addToList(subject1);
subjectlist.addToList(subject2);
我假设您的链接列表实现有效,SubjectList
first
变量指向subject1
,然后subject1
s next
个变量点到subject2
。
当您在任何其他列表中尝试使用subject1
时,这会导致明显的问题,因为它仍然包含对subject2
的引用。
如果您真的/需要为特定项目创建自己的LinkedList实现,那么您可以创建一个包装类,它具有下一个变量和对Subject的引用 - 这样,LinkedList实现不会泄漏到底层物体。
e.g。类似的东西:
public class SubjectWrapper {
Subject subject;
SubjectWrapper next;
//constructor with parameters
}
您不需要公开这个底层抽象,并且仍然将subject1
传递给addToList
方法,但是在方法中将它粘贴到包装类中。