在java

时间:2018-02-18 16:17:26

标签: java arrays file object

文件内容为:

Contents of file

该文件的前三行包含教师的名称,主题和课程时段,每个都分为不同的类变量: String teacherName,String subject,String period。

该文件的其余部分包含具有签名为:

的Student对象的所有参数

学生(String name,int studentID,int grade1,int grade2,int grade3,int grade4,int grade5,int grade6,int grade7,int grade8,int grade9,int grade10)

我对如何将学生的名字输入数组感到困惑,因为它在它之间包含一个空格,所以当我尝试使用.next()时,它只获取学生的姓氏而不是他们的全名名字,关于如何输入它的任何想法?

3 个答案:

答案 0 :(得分:0)

如果您真的必须以这种方式使用该文件,并且您确定,studentId始终以数字开头,您可以先检查数字的首次出现,然后再分割您的行。

但是,如果您可以更改分隔符,我强烈建议您使用分号之类的内容。

答案 1 :(得分:0)

不便。像这样:

public class Foo {
    public static void main(String[] args) throws IOException {
        Data data = new Data();

        try (BufferedReader in = new BufferedReader(new InputStreamReader(Foo.class.getResourceAsStream("data.txt")))) {
            data.setTeacherName(in.readLine());
            data.setSubject(in.readLine());
            data.setPeriod(Integer.parseInt(in.readLine()));

            String str;

            while ((str = in.readLine()) != null) {
                String[] studentData = str.split(";");
                Data.Student student = new Data.Student();
                student.setName(studentData[0]);
                student.setId(Integer.parseInt(studentData[1]));

                for (int j = 0; j < 10; j++)
                    student.addGrade(j, Integer.parseInt(studentData[j + 2]));

                data.addStudent(student);
            }
        }
    }
}

<强> Data.class

public class Data {
    private String teacherName;
    private String subject;
    private int period;
    private Map<Integer, Student> students = new HashMap<>();

    public void addStudent(Student student) {
        students.put(student.getId(), student);
    }

    public static final class Student {
        private String name;
        private int id;
        private int[] grades = new int[10];

        public void addGrade(int pos, int value) {
            if (pos < grades.length)
                grades[pos] = value;
        }
    }
}

实际上,如果您知道学生的姓名可以space,那么除了space之外,您可以使用任何分隔符

在一般用法中,csv很容易创建和准备。但是,如果您的数据结构更复杂且具有层次性,例如就像在你的例子中,但在一个文件中有多个教师,我建议你看另一种格式: YAML

答案 2 :(得分:0)

首先创建一个用于存储学生标记的简单模型。我将此模型命名为Student。以下是学生模型的代码。



    public class Student {
         int[] marks;
         public Student(){
             this.marks = new int[10];
         }


        public void setMark(int i, int score){
            marks[i] = score;
        }
    }

然后像往常一样阅读前三行。然后循环遍历所有行,同时在数组列表中创建和存储student对象,如下所示。

`

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class FileConnector {
    public void readFile(String fileName){
        String line =null;
        ArrayList<Student> students = new ArrayList<Student>();
        try {
            // FileReader reads text files in the default encoding.
            FileReader fileReader = new FileReader(fileName);
            // Always wrap FileReader in BufferedReader.
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            line = bufferedReader.readLine();
            String teachersName = line;
            line = bufferedReader.readLine();
            String subject =line;
            line = bufferedReader.readLine();
            int period =  Integer.valueOf(line);

            while((line = bufferedReader.readLine()) != null) {
                Student student = new Student();
                String[] marks =line.split(" ");
                for (int i = 0; i < marks.length; i++) {
                    student.setMark(i,Integer.parseInt(marks[i]));
                }
                students.add(student);
            }


            bufferedReader.close();
        }
        catch(FileNotFoundException ex) {
            System.out.println(
                    "Unable to open file '" +
                            fileName + "'");
        }
        catch(IOException ex) {
            System.out.println(
                    "Error reading file '"
                            + fileName + "'");
            // Or we could just do this:
            // ex.printStackTrace();
        }
    }
}

` 现在你可以从main方法调用它



    FileConnector fileConnector = new FileConnector();
    fileConnector.readFile();