当前位置: 首页 > 知识库问答 >
问题:

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

咸昀
2023-03-14

我已经尝试了三天的工作来解决这些问题,但它并不像我预期的那样起作用。下面是描述和代码:

描述:

  • 人员类
  • 学生类从Person继承:最重要的是属性favSubject的数据类型是ArrayList
  • 教师类从Person继承
  • PrintInfo类包含:构造函数、print方法和从文件读取方法

Person类:

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[0]);
                            }
                        }
                    }
                    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:

结构:

  • 学生:顺序、ID、姓名、分数
  • 老师:顺序、姓名、科目
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

共有1个答案

茹建茗
2023-03-14
  • 学生类从Person继承:最重要的是属性favSubject的数据类型是ArrayList

您让我们猜测为什么favSubject的数据类型特别重要。我还是不确定我看到了。然而,关于这个属性,我看到的是它的数据记录在一个独立的文件中,而不是主person数据。由于在构造时需要studentFavSubject数据,因此有两个主要的选择:

>

  • 每次您发现需要构造student时,请阅读最喜爱的科目文件以查找该学生最喜爱的科目。

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

    在这些方法中,我推荐后者,因为它效率更高,模块化程度更高(使其更易于编写、理解和调试)。

    您的另一个主要问题可能是如何区分人员列表文件中的学生和教师。这两者之间最容易识别的区别可能是字段的数量,因此考虑一次读取文件整行

    String line = myReader.nextLine();
    

    ,将行拆分为分隔符上的字段

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

    ,并使用字段计数区分学生(4个字段)和教师(3个字段)。这也为您在构造函数参数方面提供了一个先机。

    这就是我准备给你的暗示。但是,就代码风格而言,我注意到pathpath1对于方法参数来说是一个非常缺乏信息的名称,特别是在没有任何代码文档的情况下。我建议使用更多的描述性名称,特别是标识哪个文件的路径。

  •  类似资料:
    • 我使用的是jdk8,需要创建一个以类名作为构造函数参数的Spring组件。但是,使用我当前的代码,我遇到了运行时错误: 这是我的博客类: 这就是我尝试创建类的方式: 我可以了解一下创建该组件的正确方法/这里出了什么问题吗?提前感谢。

    • 我正试图用BlueJ完成一项为uni完成的任务,但我在第一个障碍上遇到了障碍。 在赋值中,我们得到了一个类,以及该类的构造函数、方法和参数的名称。我们不允许更改这些,因为赋值部分地由测试单元标记(或类似的东西)。 该类的一个构造函数如下所示 我已经(部分)完成了 我不明白的是为什么-为什么他们使用作为构造函数的参数?这样做有什么好处? (我想这样做肯定有好处(如果没有,功能就不会存在),但我不明白

    • 问题内容: 在Java中,以以下方式初始化String数组是完全合法的: 但是,当尝试实例化以String数组作为参数的类时,不允许以下代码: 但这再次起作用: 有人可以解释为什么吗? 问题答案: String[] s = {“FOO”, “BAR”}; 仅在声明时允许 你不能

    • 我想对签名为的方法进行单元测试 连接对象使用 并在测试时传递给methodA。 神谕sql。数组有一个构造函数 methodA具有获取ArrayDescriptor的逻辑。它还具有为该构造函数提供第三个参数的逻辑,但它将其作为对象数组提供 我模拟这两组逻辑,并传递一个模拟的ArrayDescriptor对象和一个模拟的对象数组。所有这些模仿都是正确的。 所以我的构造函数调用就像 当作为测试的一部分

    • 鉴于 IntelliJ IDEA 2016.1.1报告“可以替换为方法引用”。 我知道无参数构造函数的< code>Foo::new语法,但是不知道如何将< code>foo作为参数传入。我肯定漏掉了什么。