通过java 的流来对该文件内数据进行排序

在Java中,可以使用流(Stream API)来处理文件数据并进行排序。以下是一个示例代码,展示如何读取文件内容、解析数据,并按照总分从高到低进行排序。如果总分相同,则按学号从小到大排序。

import java.io.BufferedReader; // 导入BufferedReader类,用于高效地读取文本文件
import java.io.FileReader; // 导入FileReader类,用于读取字符文件
import java.io.IOException; // 导入IOException类,用于处理输入输出异常
import java.util.ArrayList; // 导入ArrayList类,用于创建动态数组
import java.util.Comparator; // 导入Comparator接口,用于定义排序规则
import java.util.List; // 导入List接口,用于处理列表

// 定义一个Student类,用于存储学生信息
class Student {
    private String id; // 学生学号
    private String name; // 学生姓名
    private int classNumber; // 班级编号
    private int mathScore; // 数学成绩
    private int chineseScore; // 语文成绩
    private int englishScore; // 英语成绩
    private int totalScore; // 总分

    // Student类的构造函数,用于初始化学生信息
    public Student(String id, String name, int classNumber, int mathScore, int chineseScore, int englishScore, int totalScore) {
        this.id = id;
        this.name = name;
        this.classNumber = classNumber;
        this.mathScore = mathScore;
        this.chineseScore = chineseScore;
        this.englishScore = englishScore;
        this.totalScore = totalScore;
    }

    // Getter方法,用于获取学生信息
    public String getId() { return id; }
    public String getName() { return name; }
    public int getClassNumber() { return classNumber; }
    public int getMathScore() { return mathScore; }
    public int getChineseScore() { return chineseScore; }
    public int getEnglishScore() { return englishScore; }
    public int getTotalScore() { return totalScore; }

    // 重写toString方法,用于返回学生信息的字符串表示形式
    @Override
    public String toString() {
        return String.format("%s\t%s\t%d\t%d\t%d\t%d\t%d", id, name, classNumber, mathScore, chineseScore, englishScore, totalScore);
    }
}

// 定义SortStudents类,包含main方法
public class SortStudents {
    public static void main(String[] args) {
        String filePath = "score.txt"; // 文件路径,指向score.txt文件
        List<Student> students = new ArrayList<>(); // 创建一个ArrayList,用于存储Student对象

        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { // 尝试打开文件并创建BufferedReader对象
            String line;
            // 跳过表头
            br.readLine();
            while ((line = br.readLine()) != null) { // 逐行读取文件内容
                String[] data = line.split("\t"); // 使用制表符分割每一行,得到数据数组
                // 解析数据数组,创建Student对象,并添加到students列表中
                String id = data[0];
                String name = data[1];
                int classNumber = Integer.parseInt(data[2]);
                int mathScore = Integer.parseInt(data[3]);
                int chineseScore = Integer.parseInt(data[4]);
                int englishScore = Integer.parseInt(data[5]);
                int totalScore = Integer.parseInt(data[6]);

                students.add(new Student(id, name, classNumber, mathScore, chineseScore, englishScore, totalScore));
            }
        } catch (IOException e) { // 捕获并处理IOException异常
            e.printStackTrace();
        }

        // 使用流进行排序
        students.stream() // 创建students列表的流
                .sorted(Comparator // 定义排序规则
                        .comparingInt(Student::getTotalScore).reversed() // 首先按照总分降序排序
                        .thenComparing(Student::getId)) // 如果总分相同,则按照学号升序排序
                .forEach(System.out::println); // 打印排序后的学生信息
    }
}

score.txt文件内容如下图片

对score.txt内数据进行排序后结果截图;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值