1

我正在编写一个从文件读取的程序。文件中的每一行都包含有关学生的信息。每个学生都由“学生”类中的一个对象表示。该类Student有一个getName返回学生姓名的方法。通过文件的方法返回包含学生对象的 ArrayList。我的问题是,每次我使用 for 循环访问 ArrayList 并获取每个学生的姓名时,我得到的是列表中最后一个学生的姓名。通过文件的方法称为“FileAnalyzer” 下面是我的代码。

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class StudentStats {

public static void main(String[] args) {

    List<Student> example = null;
    example = FileAnalyzer("C:\\Users\\achraf\\Desktop\\ach.csv");

    for ( int i = 0; i < example.size(); i++)
    {
        System.out.println(example.get(i).getName());
    }

}

public static List<Student> FileAnalyzer(String path) //path is the path to the file
{ 
    BufferedReader br = null;
    List<Student> info = new ArrayList<Student>();
    String line = "";

    try {
        br = new BufferedReader (new FileReader(path));

        while ((line = br.readLine()) != null)
        {
            //We create an object "Student" and add it to the list

            info.add(new Student(line));

        }

        }

    catch (FileNotFoundException e) {
        System.out.println("Aucun fichier trouvé");
    } catch (IOException e) {
        e.printStackTrace();
    }

    finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    return info;
}

如果您需要,这里是班级学生的代码

// This class create objects for each student

public class Student {

    private static String Name ="";
    private static String Sex = "";
    private static String Grade = "";

    //constructor
    public Student(String infos)
    {
        String [] etudiant = infos.split(",");

        Name = etudiant[0];
        Sex = etudiant[1];
        Grade = etudiant[2];            
    }

    // Getter functions

    public String getName()
    {
        return Name;
    }
    public String getSex()
    {
        return Sex;
    }
    public String getGrade()
    {
        return Grade;
    }

}

下面是程序读取的典型文件的内容。

lovett,M,12
Achos,F,23
Loba,M,24

真正的问题是,在运行我的代码以获取名称后,我得到了三次名称“Loba”,而不是获取所有名称。

4

2 回答 2

3

这是您Student课堂上的问题:

private static String Name ="";
private static String Sex = "";
private static String Grade = "";

您需要static从成员变量中删除 ,否则所有对象将共享相同的属性,因此您始终只能看到写入这些变量中的最后一个值。

在此处了解有关实例和类变量的更多信息:http: //docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

于 2013-08-10T03:02:47.527 回答
2

您的成员变量在 Student 类中声明为静态的。这意味着它们在整个程序中作为一个副本存在,而不是作为您想要的每个实例一个副本存在。每次创建新学生时,都会将姓名、性别和年级设置为新的,但这些值与任何特定学生无关。所有学生共享这些属性,并且它们在您的文件读取循环中被覆盖,因此文件中的姓氏将是静态变量的名称。

于 2013-08-10T03:01:36.803 回答