arraylist作为构造函数的参数和从文件中读取数组列表的问题

z9gpfhce  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(354)

我已经试着解决这些问题三天了,但没有达到我的预期效果。以下是说明和代码:
说明:
人员等级
学生类继承自person:最重要的是favsubject属性的数据类型是arraylist
师承人
printinfo类包含:构造函数、print方法和readfromfile方法
人员类别:

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;
    }
}

教师班级:

public class Teacher extends Person {

    private String subject;

    public Teacher(String name, String subject){
        super(name);
        this.subject = subject;
    }

    //setter and getter

    @Override
    public String toString(){
        return this.name + "-" + this.subject;
    }
}

printinfo类

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 {
            HashMap<String,ArrayList<String>> favSub = new HashMap<>();
            Scanner myReader1 = new Scanner(new File(path1));
            while (myReader1.hasNextLine()){
                String p = myReader1.nextLine();
                String[] spl = p.split(",");
                if (spl.length==3){
                    favSub.put(spl[0],new ArrayList<String>());
                    favSub.get(spl[0]).add(spl[1]);
                    favSub.get(spl[0]).add(spl[2]);
                }
                if (spl.length==2){
                    favSub.put(spl[0],new ArrayList<String>());
                    favSub.get(spl[0]).add(spl[1]);
                }
            }
            myReader1.close();
            Scanner myReader = new Scanner(new File(path));
            ArrayList<String> favSubject = new ArrayList<>();
            while (myReader.hasNextLine()) {
                String ps = myReader.nextLine();
                String[] split = ps.split(",");
                if (split.length==3){
                    Person t = new Teacher(split[1],split[2]);
                    result.add(t);
                }
                if (split.length==4){
                    for (String key : favSub.keySet()) {
                        if (key.equals(split[1])){
                            Object[] arr = favSub.get(key).toArray();
                            String[] spl2 = Arrays.copyOf(arr,arr.length,String[].class);
                            if (spl2.length==2){
                                favSubject.add(spl2[0]);
                                favSubject.add(spl2[1]);
                            }
                            if (spl2.length==1){
                                favSubject.add(spl2[1]);
                            }
                        }
                    }
                    Person s = new Student(split[2],split[1],favSubject,Double.parseDouble(split[3]));
                    result.add(s);
                }
            }
            myReader.close();
        } catch (FileNotFoundException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
        return result;
    }
}

测试等级:

import java.util.*;
import java.io.*;
public class TestPerson {
    public static void main(String[] args) throws FileNotFoundException{
        PrintInfo a = new PrintInfo("ListOfPerson.txt", "FSInfo.txt");
        a.printInfoList();
    }
}

我想用getinfofromfile()方法从listofperson(基本信息)和fsinfo(favsubject属性的收藏夹主题)两个文件中读取数据,然后将其显示在屏幕上
listofperson.txt文件:
结构:
学生:顺序,身份证,姓名,分数
老师:顺序,名字,科目

1, A01, David, 10
2, Kate, Physics
3, A02, John, 9
4, A03, Olivia, 9
5, Helen, Math
6, A04, Sarah, 8
7, Nick, History
8, A05, Jennie, 10
9, A06, Jeremy, 9
10, Mary, Chemistry

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

这只是练习的开始,所以我必须解决这个问题,以满足更多的要求。非常感谢:))更新:我已经更新了printinfo类的代码,但这是屏幕上打印的内容

David - A01 - [] - 10
Kate - Physic
John - A02 - [] - 9
Olivia - A03 - [] - 9
Helen - Math
Sarah - A04 - [] - 8
Nick - History
Jennie - A05 - [] - 10
Jeremy - A06 - [] - 9
Mary - Chemistry
5jdjgkvh

5jdjgkvh1#

学生类继承自person:最重要的是favsubject属性的数据类型是arraylist
你让我们猜测 favSubject 特别重要。我还是不确定我看到了。但是,关于这个属性,我看到的是,它的数据记录在一个独立于主要人员数据的文件中。既然你需要 favSubject a的数据 Student 在构建时,您有两个主要的备选方案:
每次你意识到你需要构建一个 Student ,阅读最喜欢的主题文件以查找该学生最喜欢的主题。
首先读取并解析整个最喜欢的主题文件,将结果存储在一个便于以后访问的表单中。就我个人而言,我会使用 Map<String, ArrayList<String>> ,以学生id为键,以最喜爱的主题列表为值。
其中,我推荐后者,因为后者效率更高,模块化程度更高(更易于编写、理解和调试)。
对您来说,另一个主要问题可能是如何在人员列表文件中区分学生和教师。最容易识别的区别可能是字段的数量,因此请考虑一次读取一整行文件

String line = myReader.nextLine();

,将行拆分为 , 分隔符

String[] fields = line.split(", *");

,并使用字段计数区分学生(4个字段)和教师(3个字段)。这也让你在构造器参数上有了一个先机。
这就是我准备给你的暗示。然而,就代码风格而言,我发现 path 以及 path1 对于您的方法参数来说是非常没有格式的名称,特别是在没有任何代码文档的情况下。我建议使用更具描述性的名称,特别是标识哪个文件的路径。

相关问题