Java ArrayList作为构造函数的参数,以及有关从文件中读取数组列表的问题

Java ArrayList作为构造函数的参数,以及有关从文件中读取数组列表的问题,java,arraylist,readfile,Java,Arraylist,Readfile,我已经花了三天的时间试图解决这些问题,但没有达到我的预期效果。以下是说明和代码: 说明: 人类 Student类继承自Person:最重要的是favSubject属性的数据类型是ArrayList 教师课堂继承自人 PrintInfo类包含:构造函数、打印方法和从文件读取方法 人员类别: public class Person { protected String name; public Person(String name){ this

我已经花了三天的时间试图解决这些问题,但没有达到我的预期效果。以下是说明和代码:

说明:

  • 人类
  • Student类继承自Person:最重要的是favSubject属性的数据类型是ArrayList
  • 教师课堂继承自人
  • PrintInfo类包含:构造函数、打印方法和从文件读取方法
人员类别:

public class Person {
    
    protected String name;
    
    public Person(String name){
        this.name = name;
    }
    
    //setter and getter
    
    @Override
    public String toString(){
        return this.name;
    }
}
学生班级:

public class Student extends Person {
    
    private String id;
    private ArrayList<String> favSubject;
    private double score;
    
    public Student(String name, String id, ArrayList<String> favSubject, double score){
        super(name);
        this.id = id;
        this.favSubject = favSubject;
        this.score = score;
    }
    
    //setter and getter
    
    @Override
    public String toString(){
        return this.name + "-" + this.id + "-" + this.favSubject + "-" + this.score;
    }
}
打印信息类

import java.util.*;
import java.io.*;
import java.lang.String;
public class PrintInfo {
    
    private ArrayList<Person> persList;
    
    //Constructor
    public PrintInfo(String path, String path1) throws FileNotFoundException{
      persList = getInfoFromFile(path, path1);
    }
    
    //Print method
    public void printInfoList(){
      for(Person p : persList){
        System.out.println(p);
      }
    }

    //Read from file method
    public ArrayList<Person> getInfoFromFile(String path, String path1) throws FileNotFoundException{
        ArrayList<Person> result = new ArrayList<>();
        try {
            
            //this code is hidden because of privacy

        } catch (FileNotFoundException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
        return result;
    }
}
我想用getInfoFromFile()方法从2个文件ListOfPerson(基本信息)和FSInfo(favSubject属性的收藏夹主题)中读取数据,然后将其显示在屏幕上

listoperson.txt:

结构:

  • 学生:顺序,身份证,姓名,分数
  • 老师:顺序、姓名、科目
FSInfo.txt:

结构:id,最喜欢的主题

A01, Math, Physics
A02, Physics
A03, Chemistry, History
A04, Math, Geography
A05, Chemistry
A06, Biology
我想在屏幕上显示的内容:

David - A01 - [Math,Physics] - 10
Kate - Physic
John - A02 - [Physics] - 9
Olivia - A03 - [Chemistry,History] - 9
Helen - Math
Sarah - A04 - [Math,Geography] - 8
Nick - History
Jennie - A05 - [Chemistry] - 10
Jeremy - A06 - [Biology] - 9
Mary - Chemistry
这只是练习的开始,所以我必须解决这个问题,以满足更多的要求。 非常感谢:))

更新:问题解决:))谢谢大家

  • Student类继承自Person:最重要的是favSubject属性的数据类型是ArrayList
您让我们猜测为什么
favSubject
的数据类型特别重要。我还是不确定我是否看到了它。但是,关于这个属性,我看到的是,它的数据记录在一个独立于主要人员数据的文件中。由于在构建时需要
学生的
favSubject
数据,因此您有两个主要选择:

  • 每次您认识到需要构建一个
    学生
    ,请阅读喜爱的主题文件以查找该学生喜爱的主题

  • 首先读取并解析整个最喜欢的主题文件,将结果存储在一个便于以后访问的表单中。就我个人而言,我会使用
    地图
    ,以学生ID为关键,以最喜欢的主题列表为值

  • 其中,我推荐后者,因为它更高效、更模块化(更易于编写、理解和调试)

    对于您来说,另一个主要问题可能是如何在人员列表文件中区分学生和教师。在这些之间识别最简单的差别可能是字段的数量,所以考虑每次读取文件的完整行

    String line = myReader.nextLine();
    
    ,将行拆分为
    分隔符上的字段

    String[] fields = line.split(", *");
    
    ,并使用字段计数区分学生(4个字段)和教师(3个字段)。这也让您在构造函数参数上领先


    这就是我准备给你的暗示。但是,就代码风格而言,我注意到
    path
    path1
    对于方法参数来说是完全没有信息的名称,尤其是在没有任何代码文档的情况下。我建议使用更具描述性的名称,特别是用于识别文件路径的名称。

    我的建议:我不会将教师和学生混为一谈。这只会使事情复杂化。我也不会混合它们,@NomadMaker,或者如果我确实混合了它们,那么我会使用一种更清楚区分哪个是哪个的格式。但我认为输入文件的格式是作业的一部分,不允许修改。这个问题似乎与您的问题非常相似。我重新编写了代码,它可以工作,但它不打印favSubject数组列表(它只是打印David-A01-[]-10)。你能帮我查一下吗?@huy_tran_2308,我不明白你为什么要用最喜欢的科目做这样的体操。当你需要一个学生最喜欢的科目列表时,为什么不直接从地图中检索并按原样使用呢?@huy_tran_2308,现在问题中给出的代码似乎正确地完成了这项工作,前提是没有一个学生拥有两个以上的科目。如果它似乎没有完成任务,那么我建议使用调试器来跟踪它的行为。这是你复杂的方法,以获取数据回来,似乎有问题的我。非常感谢你!我已经修复了它,它运行成功
    David - A01 - [Math,Physics] - 10
    Kate - Physic
    John - A02 - [Physics] - 9
    Olivia - A03 - [Chemistry,History] - 9
    Helen - Math
    Sarah - A04 - [Math,Geography] - 8
    Nick - History
    Jennie - A05 - [Chemistry] - 10
    Jeremy - A06 - [Biology] - 9
    Mary - Chemistry
    
    String line = myReader.nextLine();
    
    String[] fields = line.split(", *");