【问题标题】:Two Different types of Arrays into the first Array两种不同类型的数组放入第一个数组
【发布时间】:2012-04-22 08:03:27
【问题描述】:

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

还有一个新的ArrayList<Subject> 对象SubjectList list2 用于索引为0 的学生的所有科目,例如list2[0]=(java,math,etc) [对于第一个学生] list2[1]=(c++,english,etc) [对于第二个学生] 保存在一个文件中。

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

list1 index[0]=第一个学生信息,index[1]=第一个学生的科目。
index[2]=1st Student info,index[3]=1st Student's Subjects.

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

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"));`给学生珍妮。

输出应该是这样的:

[姓名:Smith ID:1 性别:M CGPA:3

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

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

未找到0

找到1

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

未找到2

[姓名:Smith ID:1 性别:M CGPA:3

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

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

【问题讨论】:

  • 如果我理解正确,您有 2 个列表。一个填充了 Student 对象,另一个填充了 String 对象。并且您希望将这些添加到一个新列表中,其中 newlist[evens] = Students 和 newlist[odds] = Strings。这是正确的吗?
  • 如果您的代码太乱而无法发布,请创建一个简短但完整的示例,不会太乱而无法发布...
  • 学生信息中为什么不添加学科信息?
  • @JonSkeet 可能是我可以在此处附加 *.java 文件。还不知道如何。
  • @rsp 这就是我想要做的。简单的程序“添加学生姓名,添加科目,显示学生信息,同时询问为该学生添加更多科目”,就像课程注册选项一样。

标签: java arrays oop


【解决方案1】:

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

你的第一个问题:

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

你的第二个问题:

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

class Relation {

private Student student;
private Subject subject;
}

然后您可以将这样的对象存储在您的列表中。

【讨论】:

  • 正如我对@rsp 所说,它就像一个课程注册选项。而我想按姓名或身份证搜索学生。然后仅将主题添加到该特定学生。整个过程只需要为学生列表创建一个文件。
  • @TamilZubair 你自己说了解决方案。您想将主题添加到特定学生。然后在学生类中提供一个方法,如 new Student().addSubject(subject)。 Arnab Datta 的回答做得很好。序列化成文件是另一个问题(但顺便说一句没问题)。
【解决方案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 作为内部类将使您为每个学生创建大量相同的科目。这完全是多余的。

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


建议的解决方案

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

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

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

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

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

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

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

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

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

最后,在您的StudentRegistry 课程中,您现在应该有两个列表: - 在校学生名单:List &lt;Student&gt; all_students; - 提供的所有科目/课程列表:`List all_subjects;

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

【讨论】:

  • 在注释中粘贴代码不可读。请将其发布为对您原始问题的编辑
  • A.如果我错了,请纠正我。 1. Main 应该是类 StudentRegister 或任何其他相对名称。 2. StudentRegister 类包含一个固定的Courselist 和一个非固定的Studentlist(New Comer)。 3. a) 学生的个人信息(姓名等)始终保密。 b)我希望所有信息都作为字符串。问年龄时出现问题,但用户输入“ABCD”。我知道有 Exception 方法。不太清楚。 4. “这是故意的吗?”我猜你的意思是ArrayList&lt;Student&gt; stulist = new ArrayList&lt;Student&gt;(); 不是故意的。需要在 StudentRegister 中注册吗?
  • B.没有cout.writeObject(this);如何保存? 5.添加科目的方法如何与该学生一起保存。我使用save来保存学生列表,如下所示。 public void save() throws IOException { .... cout.writeObject(this); cout.close(); }
  • 需要将“学生名单”与他们的科目一起保存在一个文件中。不知道如何将两个不同的列表保存在一个文件中,就像输出一样。这就是我首先想要这两种不同类型数组的一个组合数组的主要原因。在此先感谢:)
  • A. 1.应该有一个main**方法**,而不是一个叫main的类。有一个很大的不同。 A. 3. 阅读 Java I/O(文件和终端) A. 4. 是的,这就是我的意思。是的,它应该在 StudentRegister B 中。再次阅读 Java I/O to/from File。您只需先遍历一个列表,然后再遍历另一个列表,然后将它们的 toString() 表示形式打印到文件中。
【解决方案3】:

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

看看the method javadocs。

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 2011-05-28
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多