为什么我不能用Java填充arraylist

时间:2015-05-24 08:28:18

标签: java loops arraylist cycle

这是我的方法:

public void Read() {
    try{
        File fXmlFile = new File("C://Students.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);

        doc.getDocumentElement().normalize();

        NodeList nList = doc.getElementsByTagName("student");

        Student s = new Student(); // Creating a new object

        for (int i = 0; i < nList.getLength(); i++) {
            Node nNode = nList.item(i);

            if (nNode.getNodeType() == Node.ELEMENT_NODE){
                Element eElement = (Element) nNode;

                s.First_Name = eElement.getElementsByTagName("firstname").item(0).getTextContent();
                Student.Last_Name = eElement.getElementsByTagName("lastname").item(0).getTextContent();

                Student.ID = eElement.getAttribute("id");
                Student.Spec = eElement.getElementsByTagName("spec").item(0).getTextContent();
                Student.Course = eElement.getElementsByTagName("course").item(0).getTextContent();

                Student.Ratingstr = eElement.getElementsByTagName("rating").item(0).getTextContent();

                students.add(new Student());
            }
        }
    }catch(Exception e){}
}

public static void main(String argv[]){
    Student y = new Student();
    y.Read();        
}

这些是我的班级字段:

ArrayList<Student> students = new ArrayList<>();
public static String First_Name;
public static String Last_Name;
public static String ID;
public static String Spec;
public static String Course;
public static String Ratingstr;
public float Rating;

为什么我要填写第二个&#34; - 对象或第二个学生而不是第一个? 我的意思是当我在第一个循环中使用我的第一个Student对象编写第一个索引时,我需要用第二个学生填充第二个索引,但是我只用第二个学生填充First和第二个索引。我在第二个循环中覆盖了第一个索引。那是为什么?

4 个答案:

答案 0 :(得分:0)

首先,您无法将students放在Student课程中。这不是一个好主意,您必须创建一个ClassRoomstudents列表:

类似的东西:

class Student {
    public String firstName;
    public String fastName;
    public String id;
    public String spec;
    public String course;
    public String ratingstr;
    public float rating;
}

class ClassRoom  {
    ArrayList<Student> students = new ArrayList<>();

    // PUT HERE THE READ METHOD!!!!


    // optional:
    public String print() {
        // print each student inside room.students 
        for (Student s : room.students) {
            // you must have a Student.print() method!!!
            s.print();
        }
    }
}

然后:

public static void main(String argv[]) {
    ClassRoom room = new ClassRoom();
    room.read();

    room.print();
}

第二次:您没有以正确的方式填充数组列表中的对象:

Student.Last_Name 

静态引用到类Student,而不是Student s实例,正确的方法是:

s.Last_Name 

此行正在学生列表中插入一个新的学生空实例,您填写的s个实例。

students.add(new Student());

所以你的read类的ClassRoom方法的迭代就像:

if (nNode.getNodeType() == Node.ELEMENT_NODE) {
    Element eElement = (Element) nNode;
    s.firstName = eElement.getElementsByTagName("firstname").item(0).getTextContent();
    s.lastName = eElement.getElementsByTagName("lastname").item(0).getTextContent();
    s.id = eElement.getAttribute("id");
    s.spec = eElement.getElementsByTagName("spec").item(0).getTextContent();
    s.course = eElement.getElementsByTagName("course").item(0).getTextContent();
    s.ratingstr = eElement.getElementsByTagName("rating").item(0).getTextContent();

    // add the FILLED instance of Student s to ClassRoom.students!!!
    students.add(s);
}

第三(可选)

  • 强烈建议您声明Student属性private并创建gettersetter以安全地修改它们。

  • Java惯例称,变量名称必须以LOWERCASE开头,而Class名称必须以UPPERCASE开头,class StudentString firstName。< / p>

答案 1 :(得分:0)

不要使用静态字段。如果使用静态字段,则它们对于类的每个对象都是相同的。

答案 2 :(得分:-1)

您需要在每次循环迭代中创建一个新的Student实例,您需要填充该实例,然后您需要将该特定实例(而不是另一个新实例)添加到列表中,即:

    for (int i = 0; i < nList.getLength(); i++) {
        Node nNode = nList.item(i);
        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
            Element eElement = (Element) nNode;
// create a new instance of the Student in every loop iteration
            Student s = new Student();// Creating a new object
// ...and then populate that instance:
            s.First_Name = eElement.getElementsByTagName("firstname").item(0).getTextContent();
...
// add that specific instance (not another new one) to the list
            students.add(s);

答案 3 :(得分:-1)

这样做。

s.First_Name = eElement.getElementsByTagName("firstname").item(0).getTextContent();
s.Last_Name = eElement.getElementsByTagName("lastname").item(0).getTextContent();
s.ID = eElement.getAttribute("id");
s.Spec = eElement.getElementsByTagName("spec").item(0).getTextContent();
s.Course = eElement.getElementsByTagName("course").item(0).getTextContent();
s.Ratingstr = eElement.getElementsByTagName("rating").item(0).getTextContent();

students.add(s);

同样在循环开始时,创建一个Student的新实例。现在你只做了一个。每次运行循环时都应该创建一个。