繁体   English   中英

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

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

我创建了用户定义的数据类型并从文件中读取数据。 以下是代码:

学生班:

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;
}

}

以及主要编码:

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);
    }

}

没有给出语法错误。 但是当我尝试将ArrayList中的元素打印为时,

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

它仅给出文件中的最后一条记录(具有3条记录)。 为什么会这样呢? 提前致谢。

相同的学生对象被重用,因为Java在调用中将对对象的引用传递给了将学生添加到列表的对象。 换句话说,原始学生每次都通过。 解决方案是为每个呼叫创建一个新的学生。

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);
}

for循环内创建Student对象的新实例

像这样

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);
    }

实际上,您始终使用同一学生对象。您必须将Student student = new Student();放进去。 在for循环中。

尝试移动Student student = new Student(); 在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);
}

希望这可以帮助。

暂无
暂无

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

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