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

如何基于CSV格式文本文件的指定列对整行排序,无需创建自定义类

实现方案

不需要自定义Movie类的前提下,有两种常用实现方式:

方式一:自定义比较器直接排序

直接存储所有原始行数据,排序时动态提取每行的rating字段做比较即可:

// 导入必要包
import java.io.*;
import java.util.*;

public class MovieSort {
    public static void main(String[] args) {
        List<String> allLines = new ArrayList<>();
        try (BufferedReader br = new BufferedReader(new FileReader("movies.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                allLines.add(line);
            }
            // 按rating升序排序,要降序把r1和r2调换位置即可
            Collections.sort(allLines, (s1, s2) -> {
                int r1 = Integer.parseInt(s1.split(",")[2]);
                int r2 = Integer.parseInt(s2.split(",")[2]);
                return Integer.compare(r1, r2);
            });
            // 输出排序结果
            allLines.forEach(System.out::println);
        } catch (IOException e) {
            System.out.println("Error");
        }
    }
}

Java 8以下版本可替换排序部分为匿名内部类写法:

Collections.sort(allLines, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        int r1 = Integer.parseInt(s1.split(",")[2]);
        int r2 = Integer.parseInt(s2.split(",")[2]);
        return Integer.compare(r1, r2);
    }
});

方式二:桶排序(适合rating取值范围固定的场景)

因为rating只有1-5共5个固定取值,用桶排序逻辑更简单、性能更高,不需要调用系统排序能力:

import java.io.*;
import java.util.*;

public class MovieSort {
    public static void main(String[] args) {
        // 下标1~5分别对应rating1到rating5的存储桶
        List<String>[] buckets = new ArrayList[6];
        for (int i = 1; i <=5; i++) {
            buckets[i] = new ArrayList<>();
        }
        
        try (BufferedReader br = new BufferedReader(new FileReader("movies.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                int rating = Integer.parseInt(line.split(",")[2]);
                buckets[rating].add(line);
            }
            // 按rating从小到大输出所有内容
            for (int i = 1; i <=5; i++) {
                for (String movie : buckets[i]) {
                    System.out.println(movie);
                }
            }
        } catch (IOException e) {
            System.out.println("Error");
        }
    }
}

如果数据中电影名包含逗号需要额外处理CSV转义逻辑,当前示例默认每行无特殊字符可直接运行。

内容的提问来源于stack exchange,提问作者lulyerenia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 03:06:07