Java 仅将最后一个对象添加到ArrayList
我创建了一个用户定义的数据类型,并从文件中读取数据。代码如下: 学生班级:Java 仅将最后一个对象添加到ArrayList,java,arrays,object,arraylist,Java,Arrays,Object,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; p
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);
}
}
它只给出文件中的最后一条记录(有3条记录)。为什么会这样?提前感谢。重复使用同一个student对象,因为Java在将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);
}
在
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);
}
希望这有帮助。您是否尝试过调试此代码?您将发现在ArrayList中存储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);
}