use*_*480 2 java generics class arraylist
我试着做一个学生注册计划.所以我也写了一个类文件.使用该类文件,我将值放到ArrayList中.但问题是,如果我输入有关3名学生的详细信息,最后它只会打印最后一名学生的详细信息两次.我是个乞丐,请帮我解决这个问题.
这是我写的主要方法;
Student obj = new Student();
Scanner in = new Scanner(System.in);
ArrayList<Student> List = new ArrayList<Student>();
for (;;) {
System.out.print("Enter the Student ID: ");
obj.setStudentID(in.next());
System.out.print("Enter the first name: ");
obj.setFirstName(in.next());
System.out.print("Enter the last name: ");
obj.setLastName(in.next());
System.out.print("Enter the Course Work 1 marks: ");
obj.setCwk01(in.nextInt());
System.out.print("Enter the Course Work 2 marks: ");
obj.setCwk02(in.nextInt());
System.out.print("Enter the final exam marks: ");
obj.setExam(in.nextInt());
List.add(obj);
System.out.print("Enter q to stop (or any other to continue): ");
String str = in.next();
if (str.equals("q") || str.equals("Q")) {
System.out.println("\n");
break;
}
System.out.println("\n");
}
for (Student value : List) {
System.out.println(value.getCwk01());
}
Run Code Online (Sandbox Code Playgroud)
这是类文件;
public class Student {
private String studentID;
private String firstName;
private String lastName;
private int cwk01;
private int cwk02;
private int exam;
private int fMarks;
public int getfMarks() {
return fMarks;
}
public String getStudentID() {
return studentID;
}
public void setStudentID(String studentID) {
this.studentID = studentID;
}
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 int getCwk01() {
return cwk01;
}
public void setCwk01(int cwk01) {
this.cwk01 = cwk01;
}
public int getCwk02() {
return cwk02;
}
public void setCwk02(int cwk02) {
this.cwk02 = cwk02;
}
public int getExam() {
return exam;
}
public void setExam(int exam) {
this.exam = exam;
}
public void calculateFMarks() {
this.fMarks = (int) ((this.cwk01 * 0.2) + (this.cwk02 * 0.2) + (this.exam * 0.6));
}
}
Run Code Online (Sandbox Code Playgroud)
移动此声明:
Student obj = new Student();
Run Code Online (Sandbox Code Playgroud)
在for循环内.目前你正在改变同一个对象并在其中添加它的引用list.最后,所有引用都将指向同一个对象,因此在打印时会打印出相同的细节.
除此之外,我在代码中看到的问题还有很多:
请将变量名称更改List为list,甚至更好studentList.
以下if条件:
if (str.equals("q") || str.equals("Q"))
Run Code Online (Sandbox Code Playgroud)
可以替换为:
if (str.equalsIgnoreCase("q"))
Run Code Online (Sandbox Code Playgroud)
此外,无论何时使用Scanner#nextInt()或者使用Scanner#next()任何其他方法读取某些值,请确保有可用于读取的输入,否则它可能会在运行时抛出异常.你可以分别使用Scanner#hasNextInt()或Scanner#hasNext().
最后,您的代码中存在一个小错误:
String str = in.next();
Run Code Online (Sandbox Code Playgroud)
需要注意的是,你正在调用in.next()后in.nextInt().这将导致你的问题,因为在解释这个职位.按照该帖子中的解决方法,你会没事的.
哦,是的,System.out.println("\n");可以替换System.out.println();,除非你真的想要打印2个换行符.