0

私はJavaでプログラムを書いています。これは、学生、科目、教師などのさまざまなリストを持つ学生管理のようなものです。プログラムには、特に、1 つの一般的な科目リストと各生徒の 1 つの科目リストが含まれます。問題は、2 つの異なる教科を作成して一般教科リストに追加し、後でそのうちの1 つを見つけて学生の教科リストに追加すると、学生の教科リストにこれらの両方の教科が含まれることです。

Web を検索しましたが、何を探すべきかを知るのはそれほど簡単ではありません。

私は自分でデータ構造を書いています。

私のコードは次のようになります。

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;
}
4

1 に答える 1

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、次にsubject1snext変数が を指すと仮定しますsubject2

subject1への参照がまだ保持されているため、他のリストで私たちにアクセスしようとすると、これは明らかな問題を引き起こしますsubject2

特定のプロジェクト用に LinkedList の独自の実装を本当に作成する必要がある場合は、次の変数と Subject への参照を持つラッパー クラスを作成できます。基になるオブジェクトはまったくありません。

例:

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

この基礎となる抽象化を公開する必要はなく、引き続きメソッドに渡しますsubject1が、addToListメソッドではラッパー クラス内に貼り付けます。

于 2013-05-05T17:28:26.160 に答える