在Java中的不同类中使用相同类型的两个不同对象

时间:2013-05-05 16:49:31

标签: java list

我正在用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;
}

1 个答案:

答案 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方法,但是在方法中将它粘贴到包装类中。