【问题标题】:Why I can't fill arraylist in Java为什么我不能用 Java 填充数组列表
【发布时间】:2015-05-24 08:28:17
【问题描述】:

这是我的方法:

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;

为什么我要填充第二个“s”对象或第二个学生而不是第一个? 我的意思是当我在第一个周期中用我的第一个学生对象编写第一个索引时,我需要用第二个学生填充第二个索引,但我只用第二个学生填充第一个和第二个索引。我在第二个循环中覆盖了第一个索引。这是为什么呢?

【问题讨论】:

  • 你的问题不清楚。您能否重新构建它以明确您的要求?
  • 这篇文章看起来更像是手机上的短信,而不是 SO 上的问题。
  • 不要像这样编辑你的问题......stackoverflow.com/help/asking
  • 还...检查我的答案,看看为什么您的方法不起作用...
  • @Hristo,请不要将您的问题重复到其他问题中以深入了解进一步的答案 - 而是发布新问题(如果您不能,此评论的第一部分仍然适用) .

标签: java loops arraylist cycle


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先,您不能将students 放在Student 类中。这不是一个好主意,您必须创建一个 ClassRoom 类和 students 列表:

    类似:

    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 
    

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

    students.add(new Student());
    

    所以你在 ClassRoom 类的 read 方法旁边的迭代将是这样的:

    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 并创建getters 和setters 以安全地修改它们。

    • Java 约定说变量名必须以LOWERCASE 开头,Class 名称必须以UPPERCASE 开头,因此:class Student 和String firstName。

    【讨论】:

    • “首先,你不能把学生放在学生班里”。很明显,你“可以”。
    • @AnindyaDutta 当然,您可以放置​​一个列表并将其称为学生...它是 JVM 允许的...但我在谈论设计问题...所需的结果标志着什么规则可以做也可以不做...在这个具体的案例中想要的结果表明这是一个不被接受的存储学生的设计规则。
    【解决方案3】:

    您需要在每次循环迭代中创建 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);
    

    【讨论】:

    • 问题:Nodes 每次都必须创建一个新的类实例?另外我猜students 列表必须在Student 类之外
    【解决方案4】:

    这样做。

    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 的新实例。现在你只做了一个。每次运行循环时都应该制作一个。

    【讨论】:

    • students 列表在 Student 内,因此每次都无法填充新实例....
    • 我不太明白你的意思。将一个类的新实例添加到数组列表中是如何“不可能”的?
    • 我不是说...我的意思是学生列表在学生类中...如果您在每次迭代中创建一个新的学生实例,您将删除列表...请查看我的答案以查看我的意思
    • 不,您不会删除列表。我要求在循环开始时创建一个新实例,将其填满,然后将其添加到列表中。这很难理解吗?
    • 您在哪里创建students 列表?
    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    相关资源
    最近更新 更多