两种不同类型的数组进入第一个数组

时间:2012-04-22 08:03:27

标签: java arrays oop

我在对象ArrayList<Student>中创建了一个StudentList list1saving[Serialization]name,id,age,gpa,etc的学生信息(list1),以便list1[0] = 1st student's info 1}},然后是list1[1] = 2nd student's info,依此类推。

对象ArrayList<Subject>中的新SubjectList list2也适用于索引0示例list2[0]=(java,math,etc) [第一个学生] [{1}} [第二个学生]保存的学生的所有主题在文件中。

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

  

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

我遇到了这个简单的问题。请帮助。

list2[1]=(c++,english,etc)

我只是不能正确,假设添加主题`s.addSubject(s.new主题

(“OOP”,“007”));`给学生珍妮。

输出应该是:

  

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

     

,姓名:Jenny ID:2性别:F CGPA:4

     

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

     

Not Found0

     

,招致:

     

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

     

Not Found2

     

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

     

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

     

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

3 个答案:

答案 0 :(得分:3)

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

您的第一个问题:

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

您的第二个问题:

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

class Relation {

private Student student;
private Subject subject;
}

然后,您可以将此类对象存储在列表中。

答案 1 :(得分: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)班级名称 一个类不应该被称为“主”。目前还不清楚这门课是什么。相反,称之为它:学生主体 - 注册系统。 class StudentRegister应该没问题。

2)课程内容 您在Subject中将班级Student包含为内部班级。这是没有意义的,因为主题不是学生的一部分(在现实生活中的字面意义上)。尽管如此,这不是最糟糕的部分;将Subject作为内部课程将使您为每个学生创建相同科目的大量内容。这完全是多余的。

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


建议的解决方案

让我们考虑一下你对学生的了解。你知道的:

  • 您的年龄(私人年龄)
  • 您的GPA(私人int GPA)
  • 您的ID(私人字符串ID)
  • 您的姓名(私人字符串名称)
  • 您拍摄的主题列表(私人列表主题)

请注意,作为学生,您无法控制课程说明和ID

所有这些私人变量都是私密的,因为这些是您作为学生应某人要求披露的内容。它类似于有人问你“你叫什么名字?”或者“你的年龄是多少?”这是您通过实施getName()getAge()

之类的getters所取得的成就

现在让我们考虑斜体的部分。当有人询问您正在参加哪些课程时,您只需参考您和其他在大学注册的学生共同的课程列表。你没有创建自己的课程,没有其他人知道。因此,学科不应该是学生班级的内部班级。相反,它是大学提供的课程对象的参考(即指针)(继续阅读以获得进一步的解释)

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

  • 在特定年份注册的学生名单
  • 任何其他科目

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

  • 它的课程描述
  • 课程ID
  • 字符串表示(即您实现为toString())

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

请记住,每个学生都有添加科目的方法吗?您只需参考studentRegistry中存在的课程对象,并要求每个学生将这些对象添加到他们的主题列表中。 不会创建新的主题对象。每个学生的学习计划中的任何和所有主题都将引用StudentRegistry类中包含的all_subjects列表中的对象

答案 2 :(得分:0)

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

看看the method javadocs