Java 如何分配包含许多详细信息的ArrayList

Java 如何分配包含许多详细信息的ArrayList,java,class,generics,arraylist,Java,Class,Generics,Arraylist,我试着做一个学生注册项目。所以我也写了一个类文件。使用该类文件,我将值放入ArrayList。但问题是,如果我输入3个学生的详细信息,最后它只打印最后一个学生的详细信息两次。我是个乞丐,请帮我克服这个问题 这是我写的主要方法 Student obj = new Student(); Scanner in = new Scanner(System.in); ArrayList<Student> List = new ArrayList<Student&

我试着做一个学生注册项目。所以我也写了一个类文件。使用该类文件,我将值放入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());
    }
动议本声明:

Student obj = new Student();
for
循环中。当前,您正在对同一对象进行变异,并将其引用添加到
列表中。最后,所有引用都将指向同一对象,因此在打印它们时将打印出相同的细节

除此之外,我在您的代码中还看到了一些问题:

请将变量名
List
更改为
List
,或者更好的
studentList

以下
if
条件:

if (str.equals("q") || str.equals("Q"))
可替换为:

if (str.equalsIgnoreCase("q"))
此外,每当您使用
Scanner\nextInt()
Scanner\next()
或任何其他方法读取某个值时,请确保有可读取的输入,否则它可能在运行时引发异常。您可以分别使用
Scanner\hasNextInt()
Scanner\hasNext()

最后,这一行代码中有一个小错误:

String str = in.next();
请注意,您正在.nextInt()中的
之后调用.next()中的
。这将导致您出现问题,如中所述。遵循那篇文章中的解决方法,你会没事的


哦,是的,
System.out.println(“\n”)
可以替换为
System.out.println()
,除非您确实想打印2行换行符。

每次for循环运行时,您需要创建一个新的
Student
对象

for (;;) {
    final Student obj = new Student();
    // ...
}

您可以从
Student
类中删除
set
方法,并且只允许在
Student
构造函数中设置字段,以避免出现此错误。

非常感谢!!我是初学者,这些东西对我很有帮助!!!:最后,我想按他们的姓氏对名单进行排序。请告诉我怎么做。@user3438308你能单独问一个问题吗。事实上,寻找这样的问题,它已经被回答了很多次。
for (;;) {
    final Student obj = new Student();
    // ...
}