简体   繁体   English

仅将最后一个对象添加到ArrayList

[英]Only the last Object is added to the ArrayList

I created a user defined data type and read data from a file. 我创建了用户定义的数据类型并从文件中读取数据。 Here are the codes: 以下是代码:

Student Class: 学生班:

package system.data;

public class Student {

private String firstName;
private String lastName;
private String regNumber;
private int coursework1Marks;
private int coursework2Marks;
private int finalExamMarks;
private double totalMarks;

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getRegNumber() {
    return regNumber;
}

public void setRegNumber(String regNumber) {
    this.regNumber = regNumber;
}

public int getCoursework1Marks() {
    return coursework1Marks;
}

public void setCoursework1Marks(int coursework1Marks) {
    this.coursework1Marks = coursework1Marks;
}

public int getCoursework2Marks() {
    return coursework2Marks;
}

public void setCoursework2Marks(int coursework2Marks) {
    this.coursework2Marks = coursework2Marks;
}

public int getFinalExamMarks() {
    return finalExamMarks;
}

public void setFinalExamMarks(int finalExamMarks) {
    this.finalExamMarks = finalExamMarks;
}

public double getTotalMarks() {
    totalMarks = (coursework1Marks * 0.2) + (coursework2Marks * 0.2) + (finalExamMarks * 0.6);
    return totalMarks;
}

} }

And the main coding: 以及主要编码:

public class MainInterface extends javax.swing.JFrame {

private File studentFile = new File(".\\StudentMarks.txt");
private PrintWriter printWriter = null;
private FileOutputStream fileOutputStream = null;
public ArrayList<Student> studentDetails = null;
private Scanner input = null;
private int counter = 0;

/**
 * Creates new form MainInterface
 */
public MainInterface() {
    initComponents();
    setLocationRelativeTo(null);
    studentDetails = new ArrayList<Student>();
    ReadStudentDetails(studentDetails);
}
private void ReadStudentDetails(ArrayList<Student> studentDetails) {
    ArrayList<String> strList = new ArrayList<>();
    Student student = new Student();

    try {
        input = new Scanner(studentFile);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(MainInterface.class.getName()).log(Level.SEVERE, null, ex);
    }

    while(input.hasNext()){
        counter++;
        String str = input.nextLine();
        strList.add(str);
        System.out.println(counter);
    }

    for (String item : strList) {
        int x = 0;
        String[] arr = item.split(":");

        student.setFirstName(arr[0]);
        student.setLastName(arr[1]);
        student.setRegNumber(arr[2]);
        student.setCoursework1Marks(Integer.parseInt(arr[3]));
        student.setCoursework2Marks(Integer.parseInt(arr[4]));
        student.setFinalExamMarks(Integer.parseInt(arr[5]));

        studentDetails.add(student);
    }

}

There no syntax errors given. 没有给出语法错误。 But When I try to print the elements in the ArrayList as, 但是当我尝试将ArrayList中的元素打印为时,

    for(Student item: studentDetails){
        System.out.println(item.getFirstName());
    }

It gives out only the last record from the file, (which has 3 records). 它仅给出文件中的最后一条记录(具有3条记录)。 Why is this happening? 为什么会这样呢? Thanks in advance. 提前致谢。

The same student object is reused, because Java passes a reference to an object in the call that adds the student to the list. 相同的学生对象被重用,因为Java在调用中将对对象的引用传递给了将学生添加到列表的对象。 In other words, the original student is passed each time. 换句话说,原始学生每次都通过。 The solution is to create a new Student for each call. 解决方案是为每个呼叫创建一个新的学生。

for (String item : strList) {
    int x = 0;
    String[] arr = item.split(":");

    Student student = new Student();

    student.setFirstName(arr[0]);
    student.setLastName(arr[1]);
    student.setRegNumber(arr[2]);
    student.setCoursework1Marks(Integer.parseInt(arr[3]));
    student.setCoursework2Marks(Integer.parseInt(arr[4]));
    student.setFinalExamMarks(Integer.parseInt(arr[5]));

    studentDetails.add(student);
}

create new instance of Student object inside the for loop for循环内创建Student对象的新实例

like this 像这样

for (String item : strList) {
        int x = 0;
        String[] arr = item.split(":");
        Student student = new Student();
        student.setFirstName(arr[0]);
        student.setLastName(arr[1]);
        student.setRegNumber(arr[2]);
        student.setCoursework1Marks(Integer.parseInt(arr[3]));
        student.setCoursework2Marks(Integer.parseInt(arr[4]));
        student.setFinalExamMarks(Integer.parseInt(arr[5]));

        studentDetails.add(student);
    }

Actually you are always using the same student object.You have to put Student student = new Student(); 实际上,您始终使用同一学生对象。您必须将Student student = new Student();放进去。 inside the for loop. 在for循环中。

try moving Student student = new Student(); 尝试移动Student student = new Student(); inside the for loop: 在for循环中:

 for (String item : strList) {
    int x = 0;
    String[] arr = item.split(":");
    Student student = new Student();
    student.setFirstName(arr[0]);
    student.setLastName(arr[1]);
    student.setRegNumber(arr[2]);
    student.setCoursework1Marks(Integer.parseInt(arr[3]));
    student.setCoursework2Marks(Integer.parseInt(arr[4]));
    student.setFinalExamMarks(Integer.parseInt(arr[5]));

    studentDetails.add(student);
}

hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM