如何为ArrayList分配许多细节

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)

Roh*_*ain 5

移动此声明:

Student obj = new Student();
Run Code Online (Sandbox Code Playgroud)

for循环内.目前你正在改变同一个对象并在其中添加它的引用list.最后,所有引用都将指向同一个对象,因此在打印时会打印出相同的细节.

除此之外,我在代码中看到的问题还有很多:

请将变量名称更改Listlist,甚至更好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个换行符.