如何用Java读取TXT文件提取学生信息并实现姓名排序
解决方案
1. 创建Student类
首先实现包含姓名、成绩属性,且支持按姓名排序的Student类:
package project; public class Student implements Comparable<Student> { private String name; private int[] scores; // 构造方法 public Student(String name, int[] scores) { this.name = name; this.scores = scores; } // 获取姓名(用于排序和输出) public String getName() { return name; } // 获取成绩数组 public int[] getScores() { return scores; } // 实现Comparable接口,按姓名自然字母顺序排序(忽略大小写) @Override public int compareTo(Student other) { return this.name.compareToIgnoreCase(other.name); // 若需区分大小写排序,替换为:return this.name.compareTo(other.name); } // 重写toString,方便打印学生信息 @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("姓名: ").append(name).append(", 成绩: "); for (int score : scores) { sb.append(score).append(" "); } return sb.toString().trim(); } }
2. 修改StudentData类的文件读取与排序逻辑
修复原代码中姓名拆分错误的问题,实现完整的文件读取、对象创建、排序功能:
package project; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class StudentData { public static void main(String[] args) { // 替换为你的实际文件路径 File file = new File("students.txt"); // 用List存储学生,替代固定数组,更灵活 List<Student> studentList = new ArrayList<>(); try (Scanner scan = new Scanner(file)) { // try-with-resources自动关闭资源 while (scan.hasNextLine()) { String line = scan.nextLine().trim(); if (line.isEmpty()) continue; // 跳过空行 // 按逗号分割每行数据,处理元素前后空格 String[] parts = line.split(","); if (parts.length < 2) { System.out.println("无效行格式: " + line); continue; } // 提取姓名并去除前后空格 String name = parts[0].trim(); // 提取并转换成绩 int[] scores = new int[parts.length - 1]; for (int i = 1; i < parts.length; i++) { try { scores[i - 1] = Integer.parseInt(parts[i].trim()); } catch (NumberFormatException e) { System.out.println("成绩解析失败,行内容: " + line); scores[i - 1] = 0; // 可根据需求改为跳过该行 } } // 创建Student对象并加入列表 studentList.add(new Student(name, scores)); } // 按姓名字母顺序排序 Collections.sort(studentList); // 输出排序结果 System.out.println("按姓名排序后的学生信息:"); for (Student student : studentList) { System.out.println(student); } } catch (FileNotFoundException e) { System.out.println("文件不存在,请检查路径: " + file.getAbsolutePath()); e.printStackTrace(); } } }
关键说明
- 排序实现:通过让
Student类实现Comparable接口,重写compareTo方法,直接使用Collections.sort()完成姓名排序。 - 读取优化:逐行读取后分割数据,避免姓名被逗号拆分;使用
try-with-resources自动关闭IO资源,防止泄漏;添加异常处理应对格式错误的行。 - 存储灵活性:用
ArrayList替代固定大小数组,无需预先估算学生数量,自动扩容。
内容的提问来源于stack exchange,提问作者KingCandy
相关产品推荐
相关产品推荐

