对构造函数的ArrayList属性进行标记

时间:2016-09-04 12:31:19

标签: java

所以我有这个带有setter和getter等属性的Java类:

public class Student implements Comparable<Student> {

//Student attributes
protected String firstName;
protected String lastName;
protected String major;
protected String idNo;
protected ArrayList<String> courseTaken;
protected int credits;
protected double grade;

public Student(){

}
//constructor
public Student(String firstName, String lastName, String major, String idNo, ArrayList<String> courseTaken, int credits, double grade)
{
    this.firstName = firstName;
    this.lastName = lastName;
    this.major = major;
    this.idNo = idNo;
    this.courseTaken = courseTaken;
    this.credits = credits;
    this.grade = grade;
}

在我的Main.java中,我想读取一个txt文件,像我这样标记到我的Student类:

List<Student> students = new ArrayList<>();
    try
    {
        // create a Buffered Reader object instance with a FileReader
        BufferedReader br = new BufferedReader(new FileReader("file.txt"));

        // read the first line from the text file
        String fileRead = br.readLine();

        // loop until all lines are read
        while (fileRead != null)
        {
            // use string.split to load a string array with the values from each line of
            // the file, using a comma as the delimiter
            String[] tokenize = fileRead.split(",");

            // assume file is made correctly
            // and make temporary variables for the seven types of data
            String tempFirstN= tokenize[0];
            String tempLastN = tokenize[1];
            String tempMajor = tokenize[2];
            String tempIdNo = tokenize[3];
            String tempCourse = tokenize[4];
            int tempCredits = Integer.parseInt(tokenize[5]);
            double tempGpa = Double.parseDouble(tokenize[6]);


            // create temporary instance of Student object
            // and load with three data values

            /**this is the problem!!
             *
             * Student takes in all tokens as Strings when tempCourse is an ArrayList<String>
             *
             **/
            Student tempStudent = new Student(tempFirstN, tempLastN, tempMajor, tempIdNo, tempCourse, tempCredits, tempGpa);

            // add to array list
            students.add(tempStudent);

编辑:我想读的文本文件看起来像这样,其中-999是“停止读取并转到下一个数据”限制器。

Jones,Mary,903452
4342,2.5,A
3311,C
-999
Martin,Joseph,312345
4598,3,C
1122,3
-999

我认为这是可能的。显然不是。我怎样才能做到这一点?

来自代码评论:
这是问题!!
当tempCourse为ArrayList<String>

时,学生将所有标记作为字符串接收

2 个答案:

答案 0 :(得分:1)

tempCourse是一个String,但在构造函数中,您希望获得一个ArrayList<String>的课程。显然这不起作用(对于那些对象,没有从单个单个对象到ArrayLists的自动转换)。

您要么必须将此字段和构造函数参数设置为String(因此每个学生只有一个课程),要么将tempCourse标记拆分为单独的字符串(使用另一个,附加分隔符,例如分号),将它们填入一个ArrayList并将该ArrayList传递给构造函数。

答案 1 :(得分:1)

您遇到的问题是您的解析代码与文件中的数据完全不匹配。您似乎正在尝试读取所有数据,就像它在一行上一样,然后将其拆分,就像这一行包含7个令牌一样:

String[] tokenize = fileRead.split(",");

String tempFirstN= tokenize[0];
String tempLastN = tokenize[1];
String tempMajor = tokenize[2];
String tempIdNo = tokenize[3];
String tempCourse = tokenize[4];
int tempCredits = Integer.parseInt(tokenize[5]);
double tempGpa = Double.parseDouble(tokenize[6]);  // !! 7 tokens !!

但你的文件根本不是这样构建的:

Jones,Mary,903452
4342,2.5,A
3311,C
-999
Martin,Joseph,312345
4598,3,C
1122,3
-999

相反,看起来文件表示中的每个学生都包含几行,实际上是一个变量,第一行只包含3个令牌,第二行(可能)包含3个,然后是任何人猜测下一行显示的内容。

要解决此问题,您必须完全理解文件结构,然后相应地更改解析代码,包括使用内部循环读取文本,直到出现“-999”。