1

ArrayList<Student>在一个对象StudentList list1中创建了一个,即saving[Serialization]学生的信息 ( name,id,age,gpa,etc) 到 中,然后list1list1[0] = 1st student's info,然后是list1[1] = 2nd student's info等等。

ArrayList<Subject>索引为 0 的学生的所有主题的对象中还有一个新对象SubjectList list2,例如list2[0]=(java,math,etc)[for first student] list2[1]=(c++,english,etc)[for second student] 保存在文件中。

想在学生信息旁边添加主题

list1 index[0]=第一个学生信息,index[1]=第一个学生的科目。
index[2]=第一个学生信息,index[3]=第一个学生的科目。

我被这个简单的问题困住了。请帮忙。

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

[姓名:Jenny ID:2 性别:F CGPA:4 ][课程:OOP,代码:007]

未找到2

[姓名:史密斯 ID:1 性别:M CGPA:3

, 姓名: Jenny ID: 2 性别: F CGPA: 4 [课程: OOP,代码: 007]

, 姓名:罗杰 ID:3 性别:M CGPA:2 ]

4

3 回答 3

3

我认为你有两个不同的问题。

你的第一个问题:

第一个是您有一个列表,并且您想在该列表中放置不同的对象(学生对象和主题对象)。您可以通过两种不同的方式执行此操作。第一种方法是简单地将列表与对象一起使用:List<Object> list = new ArrayList<Object>();之后您可以将所有内容添加到列表中,但您还必须强制转换所有内容 - 这不是一个好的解决方案。第二个更好的解决方案是为两个对象提供一个通用接口。例如 IInformation,你的类实现的东西。但是可能很难为学生对象和主题对象找到合适的接口。但这取决于你的创造力。

你的第二个问题:

现在到你的第二个问题。我认为你的设计、架构或只是你想做的方式是错误的。你有什么问题?为什么要将信息放在学生后面的列表中?有充分的理由吗?我认为有更好的解决方案。例如,您的学生对象可以保存主题信息。那将是合乎逻辑的。作为一名学生,我知道我正在学习的科目。另一种方法是创建第三个对象来保存学生和学科之间的映射(即关系):

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;

在这里,您可以浏览列表并向其中的任何一个或全部添加主题。

编辑:添加了一些 getter 和 setter,让您更清楚地访问对象信息。


编辑 2 以解决您更新的帖子:您的代码存在许多问题。让我们从最高级的东西到低级的东西(与重要性不同)

1) 类名 一个类不应称为“Main”。目前尚不清楚该类是什么。取而代之的是,称其为:学生学科注册系统。class StudentRegister应该没问题。

2) 类内容 您将类Subject作为内部类包含在Student. 这是没有意义的,因为一门学科不是学生的一部分(在现实生活中的字面意思)。不过,这还不是最糟糕的部分;拥有Subject作为内部班级将使您为每个学生创建大量相同的科目。这是完全多余的。

现在,您还在每个 Student 对象中包含了所有学生的列表。这是故意的吗?如果是这样,这似乎有点误导。学生A不需要,也可能永远不会知道所有其他学生。更不用说,每次添加新学生 N 时,都需要添加N当前存在的所有学生对象。这也是多余的。


建议的解决方案

让我们想想你作为学生所知道的。你知道 :

  • 你的年龄(私人年龄)
  • 你的 GPA(私人 int GPA)
  • 您的 ID(私有字符串 ID)
  • 你的名字(私人字符串名称)
  • 您参加的科目清单(私人清单科目)

请注意,您作为学生无法控制课程描述和 ID 是什么

所有这些私有变量都是私有的,因为这些是您作为学生应某人要求披露的内容。这类似于有人问你“你叫什么名字?” 或“你几岁?” 等等。这就是你通过实现像getName(),之类的 getter 来完成的getAge()

现在让我们考虑斜体部分。当有人问您正在学习什么课程时,您只需参考您和其他在大学就读的学生常见的课程列表。您不会创建别人不知道的自己的课程。因此,Subject 不应该是 Student 类中的内部类。相反,它是对大学提供的课程对象的引用(即指针)(继续阅读以获取进一步解释)

现在考虑一个课程对象。该课程对象不需要知道:

  • 在给定年份注册的学生列表
  • 任何其他科目

任何给定的课程对象都需要知道:

  • 这是课程描述
  • 课程编号
  • 字符串表示形式(即您已实现为 toString() 的内容)

最后,在您的StudentRegistry班级中,您现在应该有两个列表: - 在大学注册的学生列表:List <Student> all_students; - 提供的所有科目/课程的列表:`List all_subjects;

Remember that each students have methods for adding subjects? You simply refer to the course objects that exist in the studentRegistry and ask each student to add those to their subject list. No new subject objects will be created. Any and all subjects in every student's study plan will refer to objects in the all_subjects list contained in the StudentRegistry class

于 2012-04-22T09:44:52.103 回答
0

您可以使用 List 类的 add 方法,该方法也采用索引。

看看方法 javadocs

于 2012-04-22T08:07:31.693 回答