我已经尝试了三天的工作来解决这些问题,但它并不像我预期的那样起作用。下面是描述和代码:
描述:
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:
结构:
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
您让我们猜测为什么favSubject
的数据类型特别重要。我还是不确定我看到了。然而,关于这个属性,我看到的是它的数据记录在一个独立的文件中,而不是主person数据。由于在构造时需要student
的FavSubject
数据,因此有两个主要的选择:
>
每次您发现需要构造student
时,请阅读最喜爱的科目文件以查找该学生最喜爱的科目。
首先读取并解析整个收藏夹主题文件,将结果存储在一个便于以后访问的表单中。就我个人而言,我将使用map
,以学生ID作为键,以最喜爱的主题列表作为值。
在这些方法中,我推荐后者,因为它效率更高,模块化程度更高(使其更易于编写、理解和调试)。
您的另一个主要问题可能是如何区分人员列表文件中的学生和教师。这两者之间最容易识别的区别可能是字段的数量,因此考虑一次读取文件整行
String line = myReader.nextLine();
,将行拆分为、
分隔符上的字段
String[] fields = line.split(", *");
,并使用字段计数区分学生(4个字段)和教师(3个字段)。这也为您在构造函数参数方面提供了一个先机。
这就是我准备给你的暗示。但是,就代码风格而言,我注意到path
和path1
对于方法参数来说是一个非常缺乏信息的名称,特别是在没有任何代码文档的情况下。我建议使用更多的描述性名称,特别是标识哪个文件的路径。
我使用的是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作为参数传入。我肯定漏掉了什么。