Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java的不同类中使用相同类型的两个不同对象_Java_List - Fatal编程技术网

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

在Java的不同类中使用相同类型的两个不同对象,java,list,Java,List,我正在用Java编写一个程序,它应该像一个学生管理系统,包含不同的学生、科目、教师等列表。除其他外,该课程应包括一个一般科目表和每个学生一个科目表。问题是,当我创建两个不同的主题并将其添加到常规主题列表中,然后找到其中一个并将其添加到学生主题列表中时,学生主题列表包含这两个主题 我已经在网上搜索过了,但要知道要找什么并不容易 我自己在写数据结构 我的代码如下所示: public class Subject() { Subject next; //constructor with

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

我们确实需要代码的其余部分来确认问题所在,但从您发布的内容来看,我将进行一个有根据的猜测:

在您实现自己的链表时,该实现已泄漏到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
变量首先指向
subject1
,然后
subject1
s
下一个
变量指向
subject2

当您尝试在任何其他列表中显示
subject1
时,这会导致明显的问题,因为它仍然包含对
subject2
的引用

如果您确实需要为特定项目创建自己的LinkedList实现,那么您可以创建一个包装类,该类包含下一个变量和对Subject的引用—这样,LinkedList实现就不会泄漏到底层对象

e、 g.类似于:

public class SubjectWrapper {
    Subject subject;
    SubjectWrapper next; 
    //constructor with parameters
}

您不需要公开这个底层抽象,仍然将
subject1
传递给
addToList
方法,但在该方法中,将其粘贴到包装类中。

我们确实需要代码的其余部分来真正确认问题所在,但是根据您发布的内容,我将进行一个有根据的猜测:

在您实现自己的链表时,该实现已泄漏到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
变量首先指向
subject1
,然后
subject1
s
下一个
变量指向
subject2

当您尝试在任何其他列表中显示
subject1
时,这会导致明显的问题,因为它仍然包含对
subject2
的引用

如果您确实需要为特定项目创建自己的LinkedList实现,那么您可以创建一个包装类,该类包含下一个变量和对Subject的引用—这样,LinkedList实现就不会泄漏到底层对象

e、 g.类似于:

public class SubjectWrapper {
    Subject subject;
    SubjectWrapper next; 
    //constructor with parameters
}

您不需要公开这个底层抽象,仍然将
subject1
传递给
addToList
方法,但在方法中,将其粘贴到包装类中。

addToList中可能有错误,请查找。。。但是,这些没有显示。。无论如何,这似乎是一个相当无聊的任务。不知何故,似乎你实际上没有任何
列表
。。。我希望看到这样一种结构。但是也许你应该把问题简化成一个较短的版本,然后发布这个浓缩问题的完整代码。@luksch当然没有——(s)他正在“编写数据结构h(im | er)self”。这是一个链表,显示在发布的代码中。@camilla您应该明确地发布代码,显示您如何得出列表包含两个主题的结论。如果这种列表实现不是您需求的一部分,我认为您可以使用ArrayList,这可能会简化您的问题。也许addToList和find中有错误。。。但是,这些没有显示。。无论如何,这似乎是一个相当无聊的任务。不知何故,似乎你实际上没有任何
列表
。。。我希望看到这样一种结构。但是也许你应该把问题简化成一个较短的版本,然后发布这个浓缩问题的完整代码。@luksch当然没有——(s)他正在“编写数据结构h(im | er)self”。这是一个链表,显示在发布的代码中。@camilla您应该明确地发布代码,显示您如何得出列表包含两个主题的结论。如果这种列表实现不是您需求的一部分,我认为您可以使用ArrayList,这可能会简化您的问题。我现在添加了addToList和find方法,但您描述的似乎就是问题所在!我将尝试创建一个包装器类。非常感谢您抽出时间!是的,那是你的问题。您可以通过添加一个
clone()
方法来修复它,该方法
返回主题的新实例。您应该只复制您的值,除了
。下一个
引用。@System.exit我会查看它!谢谢你抽出时间!我现在添加了addToList和find方法,但您所描述的似乎就是问题所在!我将尝试创建一个包装器类。非常感谢您抽出时间!是的,那是你的问题。您可以通过添加一个
clone()
方法来修复它,该方法
返回主题的新实例。您应该只复制您的值,除了
。下一个
引用。@System.exit我会查看它!谢谢你