Java读取学生分数文件:printAll实现与最高分获取问题求助
问题分析与代码修复
嘿,我帮你把代码里的问题都捋清楚,然后给出修复后的版本,你看了就明白啦:
核心问题梳理
- 最关键的错误:你的
readStudentData方法里创建了Student对象,但没有把对象添加到students列表中,导致后续所有依赖students的方法(比如printAll、getMaxScore)都拿不到数据! getMaxScore方法错误地直接使用了readStudentData里的局部变量items,这个变量是方法内部的,外部根本访问不到,应该遍历students列表里的学生对象来获取分数。printAll方法是空实现,需要遍历students列表来复现原来readStudentData里的打印效果。- 其他辅助方法(
getAverageScore、countPassScore、递归求和)也需要补充实现,不然输出都是0或者空。 - 小细节:
Student类里的getscore建议改成getScore,符合Java驼峰命名规范。
修复后的完整代码
import static java.lang.System.out; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; public class question5 { public static void main(String[] args) throws IOException { ScoreApp app = new ScoreApp("C:/Users/USER/workspace/Practical 2/Data/data"); app.printAll(); out.println(String.format("%50s", "").replace(' ', '-')); out.println("Max score: " + app.getMaxScore()); out.println("Average score: " + app.getAverageScore()); out.println("Number of pass scores: " + app.countPassScore()); out.println("Total score (recursion): " + recursiveGetTotalScore(app.getStudents())); } static double recursiveGetTotalScore(List<Student> list) { // 实现递归求和:基准情况+递归调用 if (list.isEmpty()) { return 0; } return list.get(0).getScore() + recursiveGetTotalScore(list.subList(1, list.size())); } } class ScoreApp { public List<Student> students; // 去掉static,因为每个ScoreApp实例应该有自己的学生列表 public List<Student> getStudents() { // getter方法 return students; } public ScoreApp(String data) throws IOException { students = new ArrayList<>(); readStudentData(data); } private void readStudentData(String data) throws IOException { // 不需要重新赋值students,构造器已经初始化了 Path path = new File(data).toPath(); List<String> content = Files.readAllLines(path); for (String line : content) { // 注意你的数据里是空格分隔的多个"ID,分数",所以先按空格拆分每个学生条目 String[] studentEntries = line.split(" "); for (String entry : studentEntries) { String[] items = entry.split(","); String id = items[0]; double score = Double.valueOf(items[1]); Student student = new Student(id, score); students.add(student); // 关键!把学生对象加到列表里 // 原来的打印可以移到printAll里,或者这里也可以保留,看需求 } } } public void printAll() { // 复现原来readStudentData里的打印效果 for (Student student : students) { out.println(student.getID() + ": " + student.getScore()); } } public double getMaxScore() { if (students.isEmpty()) { return 0; // 处理空列表的情况 } double maxScore = students.get(0).getScore(); for (Student student : students) { if (student.getScore() > maxScore) { maxScore = student.getScore(); } } return maxScore; } public double getAverageScore() { if (students.isEmpty()) { return 0; } double total = 0; for (Student student : students) { total += student.getScore(); } return total / students.size(); } public int countPassScore() { // 假设及格分是60分 int count = 0; for (Student student : students) { if (student.getScore() >= 60) { count++; } } return count; } } class Student { private String ID; private double score; public Student(String ID, double score) { this.ID = ID; this.score = score; } public String getID() { return this.ID; } public void setID(String ID) { this.ID = ID; } // 改成驼峰命名规范 public double getScore() { return this.score; } public void setScore(double score) { this.score = score; } }
关键修复点说明
- 给students列表添加学生对象:在
readStudentData里,创建Student后必须调用students.add(student),不然列表永远是空的。另外注意你的数据是空格分隔的多个条目,所以先按空格拆分每个学生的ID,分数字符串,再处理。 - 移除students的static修饰符:每个
ScoreApp实例应该有自己独立的学生列表,static会导致所有实例共享同一个列表,不符合设计逻辑。 - 重构getMaxScore方法:遍历
students列表,通过student.getScore()获取分数,而不是用局部变量items。 - 实现printAll方法:遍历students列表,打印每个学生的ID和分数,完全复现原来的打印效果。
- 补充其他方法的实现:包括平均分、及格人数统计,还有递归求和的逻辑,让程序能正常输出所有结果。
- 规范命名:把
Student类里的getscore改成getScore,符合Java的命名规范,代码更易读。
内容的提问来源于stack exchange,提问作者Tipzil
相关产品推荐
相关产品推荐

