2012-04-22 9 views
1

に私はlist1[0] = 1st student's infoているので、その後、list1[1] = 2nd student's infoというように、list1saving[Serialization]学生の情報(name,id,age,gpa,etc)であるオブジェクトStudentList list1ArrayList<Student>を作成しました。 [第二の学生のために] [最初の学生のために]二つの異なるタイプ最初の配列

インデックス0例 list2[0]=(java,math,etc)の学生のすべてのサブジェクトのオブジェクト SubjectList list2

また新しいArrayList<Subject>list2[1]=(c++,english,etc)はファイルに保存。

私は学生の情報の隣に件名を追加したい

リスト1インデックス[0] = 1番目の学生の情報、インデックスは、[1]第1回学生の科目を=。
index [2] = 1番目の学生情報、インデックス[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件名

( "OOP"、 "007"))件名を追加すると仮定した;`へ学生ジェニー。

[名:スミスID:1性別:M CGPA:3

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

出力ようにする必要があります名前:ロジャーID:3性別:M CGPA:2]

ないFound0

Found1

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

ませんFound2

[名:スミスID:1性別:M CGPA:3

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

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

+0

正しく理解すれば、2つのリストがあります。 1つはStudentオブジェクトで、もう1つはStringオブジェクトです。そしてこれらをnewlist [evens] = Studentsとnewlist [odds] = Stringsの新しいリストに追加したいとします。これは正しいです? –

+1

あなたのコードが投稿するのが面倒すぎる場合は、短くて完全な例を作成してください*はあまりにも面倒ではありません... –

+0

なぜ学生情報に科目情報を追加しませんか? @ gwhowhowellはい。 – rsp

答えて

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)授業内容 あなたはStudentで内部クラスとしてクラスSubjectが含まれています。これは、被験者が生徒の一部ではないため(実生活では文字通り)、意味をなさない。しかし、これは最悪の部分ではありません。 Subjectを内部クラスとして持つと、すべての生徒のために同じ科目の負荷を作成できます。これは完全に冗長です。

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


提案された解決策

は、あなたが学生として知っていることについて考えてみましょう。あなたが知っている:

  • あなたの年齢(プライベートint型の年齢)
  • あなたのGPA(プライベートint型GPA)
  • あなたのID(プライベート文字列ID)
  • お名前(プライベート文字列名)
  • あなたが受講する科目のリスト(私的リストの科目)

受講者は、コースの説明とIDが

これらのプライベート変数はすべて、あなたが誰かの要求に応じて学生が開示するものなので、プライベート変数です。それはあなたに「あなたの名前は何ですか?」と尋ねる人に似ています。 「あなたの年齢は?」これはgetName()getAge()のようなゲッターを実装することによって達成されます。

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

コースオブジェクトを検討してください。そのコースのオブジェクトが知っている必要はありません。

  • 与えられた年
  • に在籍している学生のリスト、他の科目

任意の与えられたコースのオブジェクトが知っている必要があります:

  • コースの説明
  • コースID
  • (つまり、あなたがのtoStringとして実装されてきたもの())

最後に、あなたのStudentRegistryクラスで、あなたは今、二つのリストを持っている必要があり表現をトリング: - : - リストList <Student> all_students; は、学生のリストは、大学に在籍しました提供されたすべての科目/科目のリスト: `List all_subjects;

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

+0

コメントにコードを貼り付けることができません。 –

+0

元の質問 – Tamim

+0

で編集しました。私が間違っている場合は、私を修正してください。 1.メインは、クラスStudentRegisterまたは他の相対名である必要があります。 2.クラスStudentRegisterには、固定Courselistと固定されていないStudentlist(New Comer)が含まれています。 3. a)学生の個人情報は常に(名前など)常にプライベートです。 b)私はすべての情報を文字列として欲しかった。年齢を聞いている間に問題が発生しますが、ユーザーは「ABCD」と入力しました。私はそのための例外メソッドがあることを知っています。よく分からない。 4.「これは意図的ですか?」あなたはこれを意味すると思います。 'ArrayList stulist = new ArrayList ();' 意図的ではありません。 StudentRegisterの権利が必要ですか? – Tamim

0

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

the method javadocsをご覧ください。

3

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

あなたの最初の問題:

最初のものは、あなたがリストを持っていて、そのリスト(学生・オブジェクトとサブジェクト・オブジェクト)に異なるオブジェクトを配置するということです。あなたは2つの異なる方法でこれを行うことができます。最初の方法はオブジェクトだけでリストを使用することです:List<Object> list = new ArrayList<Object>();その後、すべてをリストに追加できますが、すべてをキャストする必要があります。これは良い解決策ではありません。 2つ目のより良い解決策は、両方のオブジェクトに共通のインタフェースを提供することです。たとえば、クラスが実装するIInformationという名前です。しかし、学生オブジェクトとサブジェクトオブジェクトのための適切なインタフェースを見つけるのは難しいかもしれません。しかしそれはあなたの創造性の問題です。

あなたの第二の問題:あなたの第二の問題に今

。私はあなたのデザイン、アーキテクチャ、あるいはあなたがそれをやりたいやり方が間違っていると思います。あなたの問題は何ですか?なぜ学生の後ろにリストに情報を入れたいのですか?それには正当な理由はありますか?私はもっ​​と良い解決策があると思う。あなたの学生オブジェクトは、例えば、主題情報を保持することができます。それは論理的だろう。私は学生として、私が勉強している科目を知っています。もう一つの方法は、学生と被写体(すなわち関係)との間のマッピングを保持している第三の目的を作成することです:

class Relation { 

private Student student; 
private Subject subject; 
} 

あなたは、あなたのリストには、このようなオブジェクトを格納することができます。

+0

私は@rspに言ったように、それはコース登録オプションのようなものです。 私は名前またはIDで学生を検索したいのですが。その特定の生徒にのみ対象を追加します。プロセス全体で、学生リストのファイルを1つだけ作成する必要があります。 – Tamim

+0

@ TamimZubairあなたは自分自身でソリューションを言った。あなたは特定の学生に科目を追加したいと思っています。その後、新しいStudent()。addSubject(subject)のように、学生クラスにメソッドを提供します。 Arnab Dattaの答えはそれをかなりうまくやっています。ファイルへのシリアライゼーションは別のものです(ただしbtwは問題ありません)。 –