1

学生の情報 ( )ArrayList<Student>であるオブジェクトStudentList list1をに作成したので、 、、などと続きます。saving[Serialization]name,id,age,gpa,etclist1list1[0] = 1st student's infolist1[1] = 2nd student's info

インデックス 0 の生徒の全教科のArrayList<Subject>オブジェクトにも新しい例[最初の生徒用] [2 番目の生徒用] がファイルに保存されます。SubjectList list2list2[0]=(java,math,etc)list2[1]=(c++,english,etc)

学生情報の横に件名を追加したい:

list1 index[0]=1 番目の生徒の情報、index[1]=1 番目の生徒の科目。
index[2]=1 番目の生徒の情報、index[3]=1 番目の生徒の科目。

この単純な問題で立ち往生しています。助けてください。

package studentPanel;

public class Main {
    public static void main(String[] args){     
        Student s = new Student(null, null, null, null);
        s.stulist.add(new Student("Smith", "1", "M", "3"));
        s.stulist.add(new Student("Jenny", "2", "F", "4"));
        s.stulist.add(new Student("Roger", "3", "M", "2"));     
        System.out.println(""+s.stulist);
        for(int i=0;i<s.stulist.size();i++){
            Student search = s.stulist.get(i);
            if(search.toString().contains("Jenny")){
                System.out.println("Found"+i);
                s.addSubject(s.new Subject("OOP","007"));
                s.addSubjects(s.sublist);
                System.out.println(""+s.stulist.get(i)+""+s.sublist);
            }
            else System.out.println("Not Found"+i);
        }
                System.out.println(""+s.stulist);
    }
}

package studentPanel;

import java.util.*;

public class Student {
    public String name, id, gender, cgpa;

    ArrayList<Subject> sublist = new ArrayList<Subject>();
    ArrayList<Student> stulist = new ArrayList<Student>();  
    public void addSubject(Subject new_subject) {
        sublist.add(new_subject);
    }
    public void addSubjects(List<Subject> subjects_list) {
        for (Subject s : subjects_list)
            addSubject(s);
    }   
    public Student(String name, String id, String gender, String cgpa) {
        this.name = name;
        this.id = id;
        this.gender = gender;
        this.cgpa = cgpa;
    }
    public String toString() {
        return "Name: " + name + "\tID: " + id + "\tGender: " + gender + "\tCGPA: " + 

cgpa+ "\n";
    }
    public class Subject {
        public String cname,cid;
        public Subject(String cname, String cid) {
            this.cname = cname;
            this.cid = cid;
        }
        public String toString() {
            return "Course: " + cname + "\tCode: " + cid;
        }
    }
}

私はそれを正しく理解できません。件名 `s.addSubject(s.new Subject) を追加することになっていました

("OOP","007"));` 生徒のジェニーに。

出力は次のようになります。

【名前:スミス】 ID:1 性別:M CGPA:3

、名前:ジェニー ID:2 性別:F CGPA:4

、名前:ロジャー ID:3 性別:M CGPA:2 ]

見つかりません0

見つかった1

[ 名前: ジェニー ID: 2 性別: F CGPA: 4 ][コース: OOP、コード: 007]

見つかりません2

【名前:スミス】 ID:1 性別:M CGPA:3

、名前:ジェニー ID:2 性別:F CGPA:4 [コース:OOP、コード:007]

、名前:ロジャー ID:3 性別:M CGPA:2 ]

4

3 に答える 3

3

あなたには2つの異なる問題があると思います。

あなたの最初の問題:

1 つ目は、リストがあり、そのリストにさまざまなオブジェクト (学生オブジェクトと科目オブジェクト) を入れたい場合です。これは 2 つの異なる方法で行うことができます。最初の方法は、単純にオブジェクトでリストを使用することです。List<Object> list = new ArrayList<Object>();その後、すべてをリストに追加できますが、すべてをキャストする必要もあります。これは良い解決策ではありません。2 番目の優れた解決策は、両方のオブジェクトに共通のインターフェイスを提供することです。たとえば IInformation、クラスが実装するものと呼ばれるもの。しかし、学生オブジェクトと教科オブジェクトに適したインターフェースを見つけるのは難しいかもしれません。しかし、それはあなたの創造性の問題です。

あなたの2番目の問題:

次に、2番目の問題に進みます。あなたの設計、アーキテクチャ、または単にやりたい方法が間違っていると思います。あなたの問題は何ですか?学生の背後にあるリストに情報を入れたいのはなぜですか? それには正当な理由がありますか?より良い解決策があると思います。たとえば、学生オブジェクトは科目情報を保持できます。それは論理的でしょう。私は学生として、自分が勉強している科目を知っています。もう 1 つの方法は、生徒と科目の間のマッピング (つまり、関係) を保持する 3 番目のオブジェクトを作成することです。

class Relation {

private Student student;
private Subject subject;
}

その後、そのようなオブジェクトをリストに保存できます。

于 2012-04-22T08:31:46.283 に答える
2

あなたが取るべきアプローチはこれに似ていると思います:

class Student{ 
   private String name, ID;
   private int gpa, age;
   //More personalia stuff...

   private ArrayList<Subject> subjects;

   public void addSubject (Subject new_subject) { subjects.add(new_subject); }
   public void addSubjects (List <Subject> subjects_list) {
       for (Subject s : subjects_list) addSubject(s);
   }

   //Getters 
   public int getGPA() { return gpa; }
   public int getAge() { return age; }
   public String getName() { return name; }

   //.. More personalia getters

   //Setters 
   public void setGPA(int new_gpa) { gpa = new_gpa; }



 }

class Subject { 
    String description;
    String ID;

}

生徒のリストがある場合は、次のように言います。

 ArrayList <Student> all_students;

ここでは、リストを調べて、それらのいずれかまたはすべてに件名を追加できます。

編集:オブジェクト情報へのアクセス方法をより明確にするいくつかのゲッターとセッターを追加しました。


2 を編集して、更新された投稿に対処します。コードには多くの問題があります。最も高レベルのものから低レベルのものまで見ていきましょう (重要度とは異なります)。

1) クラス名 クラスを「メイン」と呼んではいけません。何科かは不明です。代わりに、学生科目登録システムと呼んでください。class StudentRegister大丈夫なはずです。

2) クラスの内容Subjectでクラスを内部クラスとして 含めましたStudent。科目は学生の一部ではないため、これは意味がありません (実生活では文字通り)。ただし、これは最悪の部分ではありません。内部クラスとして持つSubjectと、生徒ごとに同じ科目を大量に作成することになります。これは完全に冗長です。

これで、すべての Student オブジェクトにすべての生徒のリストも含めました。これは意図的なものですか?もしそうなら、それは少し間違っているようです。学生Aはその必要はなく、おそらく他のすべての学生について知ることはありません。言うまでもなく、新しい学生 N を追加するたびに、N現在存在するすべての学生オブジェクトに追加する必要があります。それも冗長です。


提案された解決策

学生として知っていることを考えてみましょう。ほら :

  • あなたの年齢 (非公開の年齢)
  • あなたの GPA (プライベート int GPA)
  • あなたのID(プライベート文字列ID)
  • あなたの名前 (プライベート文字列名)
  • あなたが取る科目のリスト(プライベートリストの科目)

学生は、コースの説明と ID が何であるかを制御できないことに注意してください。

これらのプライベート変数はすべて、学生として誰かの要求に応じて開示するものであるため、プライベートです。それは誰かがあなたに「あなたの名前は何ですか?」と尋ねるのに似ています。または「あなたの年齢は?」など。getName()_getAge()

斜体の部分を考えてみましょう。誰かがあなたが取っているコースを尋ねられたら、あなたと他の大学に在籍している学生に共通するコースのリストを参照するだけです. 他の誰も知らない独自のコースを作成することはありません。したがって、Subject は Student クラスの内部クラスであってはなりません。代わりに、大学が提供するコース オブジェクトへの参照 (つまり、ポインター) です (詳細な説明については、読み続けてください)。

ここで、コース オブジェクトを考えてみましょう。そのコース オブジェクトは、次のことを知る必要はありません。

  • 特定の年に登録されている学生のリスト
  • その他の科目

特定のコース オブジェクトは次のことを知る必要があります。

  • コース説明です
  • コースID
  • 文字列表現 (つまり、 toString() として実装したもの)

最後に、StudentRegistryクラスには次の 2 つのリストが必要です。 - 大学に在籍している学生のリスト: List <Student> all_students; - 提供されるすべての科目/コースのリスト:

各生徒には科目を追加する方法があることを覚えていますか? StudentRegistry に存在するコース オブジェクトを参照し、各学生にそれらを科目リストに追加するように依頼するだけです。新しいサブジェクト オブジェクトは作成されません。すべての学生の学習計画のすべての科目はall_subjects、StudentRegistry クラスに含まれるリスト内のオブジェクトを参照します。

于 2012-04-22T09:44:52.103 に答える
0

インデックスも取る List クラスの add メソッドを使用できます。

メソッド javadocsを見てください。

于 2012-04-22T08:07:31.693 に答える