如何基于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
相关产品推荐
相关产品推荐

