Создать список массивов объектов из файла - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть два класса Student и Students

Как мне прочитать файл в массиве student для создания student объектов без использования переменной для хранения следующей строки и преобразованияэто к требуемому типу данных (т.е. String до int).

public class Student
{
    private String name;
    private int age;
    private double gpa;

    public Student(String person, int years, double avg)
    {
        // initialise instance variables
        name = person;
        age = years;
        gpa = avg;
    }

    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
    public double getGPA()
    {
        return gpa;
    }

public class Students
{
    private ArrayList<Student>students;

    public Students()
    {
        // initialise instance variables
        students = new ArrayList<Student>();
    }
    public void add(Student s)
    {
        students.add(s);
    }
    public Student readFile() throws IOException
    {
        // reads data file into ArrayList
        String line;
        Scanner sc = new Scanner(new File("Students.txt"));
        while (sc.hasNextLine()) {
         **//code to read file into student array list**
        }
        sc.close();
    }

Файл, который я пытаюсь прочитать из

Name0
22
1.2
Name1
22
2.71
Name2
19
3.51
Name3
18
3.91

Пожалуйста, не отмечайте как дубликаты илипохожий вопрос.Я интенсивно искал ответы на вопросы, аналогичные тем, что я пытаюсь достичь, но не нашел ни одного, который бы мне помог.

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018
import java.util.List;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;

public class Students
{
    public static void main(String[] args){
        List<Student> students = new ArrayList<Student>();
        File file = new File("C:\\Users\\Nik\\Desktop\\test.txt"); //Update path
        int i = 0;  
        BufferedReader br;
        try {
            br = new BufferedReader(new FileReader(file));


            String line;
            Student student = new Student();
            while ((line = br.readLine()) != null) {
                if(i%3 == 0){
                    student = new Student();
                    student.setName(line);
                } else if (i%3 == 1){
                    if(line != null && !line.isEmpty() && isNumber(line)){
                        student.setAge(Integer.parseInt(line));
                    }
                } else if(i%3 == 2){
                    if(line != null && !line.isEmpty() && isNumber(line)){
                        student.setGpa(Double.parseDouble(line));
                    }
                    students.add(student);
                }   
                i++;
            }

            for(Student x:students){
                System.out.println(x.toString());
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }

    static boolean isNumber(String s){
        return s != null && s.matches("[-+]?\\d*\\.?\\d+");  
    }   
}   



class Student
{
    private String name;
    private int age;
    private double gpa;

    public Student(String person, int years, double avg)
    {
        // initialise instance variables
        name = person;
        age = years;
        gpa = avg;
    }

    public Student() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getGpa() {
        return gpa;
    }

    public void setGpa(double gpa) {
        this.gpa = gpa;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", gpa=" + gpa + "]";
    }
}
0 голосов
/ 28 марта 2019

попробуйте таким образом

public Student readFile() throws IOException
        {
            // reads data file into ArrayList
            String line;
            Scanner sc = new Scanner(new File("Students.txt"));
            while (sc.hasNextLine()) {
             Student student = new Student(sc.nextLine(), Integer.parseInt(sc.nextLine()), Double.parseDouble(sc.nextLine()));
            }
            sc.close();
        }
0 голосов
/ 15 декабря 2018

Чтобы получить строку из файла, вы можете вызвать Scanner.nextString (): поскольку ваш объект сканера называется sc, он будет выглядеть как sc.nextString ().Чтобы получить int, вы можете вызвать Scanner.nextInt (), а чтобы получить double, вы можете вызвать Scanner.nextDouble ().

Вы не хотите хранить их в промежуточных значениях, но вместо этого хотите сразу создать значение для учащихся.Вы можете поместить все, что хотите, в конструктор Student, если первое, что вы помещаете, оценивается как String, второе - как int, а третье - как double.Поскольку в вашем файле всегда есть String, а затем int, а затем double, я думаю, что вы можете использовать методы, перечисленные выше, и вызвать конструктор Student, чтобы получить значение Student.

...