我已经试着解决这些问题三天了,但没有达到我的预期效果。以下是说明和代码:
说明:
人员等级
学生类继承自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
1条答案
按热度按时间5jdjgkvh1#
学生类继承自person:最重要的是favsubject属性的数据类型是arraylist
你让我们猜测
favSubject
特别重要。我还是不确定我看到了。但是,关于这个属性,我看到的是,它的数据记录在一个独立于主要人员数据的文件中。既然你需要favSubject
a的数据Student
在构建时,您有两个主要的备选方案:每次你意识到你需要构建一个
Student
,阅读最喜欢的主题文件以查找该学生最喜欢的主题。首先读取并解析整个最喜欢的主题文件,将结果存储在一个便于以后访问的表单中。就我个人而言,我会使用
Map<String, ArrayList<String>>
,以学生id为键,以最喜爱的主题列表为值。其中,我推荐后者,因为后者效率更高,模块化程度更高(更易于编写、理解和调试)。
对您来说,另一个主要问题可能是如何在人员列表文件中区分学生和教师。最容易识别的区别可能是字段的数量,因此请考虑一次读取一整行文件
,将行拆分为
,
分隔符,并使用字段计数区分学生(4个字段)和教师(3个字段)。这也让你在构造器参数上有了一个先机。
这就是我准备给你的暗示。然而,就代码风格而言,我发现
path
以及path1
对于您的方法参数来说是非常没有格式的名称,特别是在没有任何代码文档的情况下。我建议使用更具描述性的名称,特别是标识哪个文件的路径。