You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:25:20