从CSV读取数据到ArrayList并按多列规则排序的技术问题
解决CSV数据按指定列顺序排序的问题
嘿,我来帮你搞定这个问题!你现在的核心困扰应该是缺少一个合适的对象来封装每一行的四个整数,导致没法精准地按d→c→b→a的规则做排序对吧?别担心,咱们一步步来实现:
第一步:创建行数据封装类
首先,咱们需要一个类来存储每一行的a、b、c、d四个整数,这样ArrayList里的每个元素就是完整的一行数据,方便后续比较。示例代码如下:
public class RowData { private int a; private int b; private int c; private int d; // 构造方法 public RowData(int a, int b, int c, int d) { this.a = a; this.b = b; this.c = c; this.d = d; } // 必须的getter方法,排序时要获取对应字段值 public int getA() { return a; } public int getB() { return b; } public int getC() { return c; } public int getD() { return d; } // 可选:重写toString方便调试查看数据 @Override public String toString() { return "a=" + a + ", b=" + b + ", c=" + c + ", d=" + d; } }
第二步:读取CSV到ArrayList
接下来咱们把CSV文件里的每一行数据解析成RowData对象,存入ArrayList。这里用Java原生的BufferedReader做示例,你也可以用OpenCSV这类第三方库简化操作:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class CsvHandler { public static void main(String[] args) { ArrayList<RowData> rowList = new ArrayList<>(); String csvFilePath = "你的CSV文件路径.csv"; try (BufferedReader br = new BufferedReader(new FileReader(csvFilePath))) { String line; // 跳过表头(如果你的CSV有表头的话,没有就删掉这行) br.readLine(); while ((line = br.readLine()) != null) { // 按逗号分割每一行,注意如果CSV里有带逗号的字段,需要更复杂的解析逻辑 String[] values = line.split(","); if (values.length == 4) { // 把字符串转成整数,注意处理转换异常 int a = Integer.parseInt(values[0].trim()); int b = Integer.parseInt(values[1].trim()); int c = Integer.parseInt(values[2].trim()); int d = Integer.parseInt(values[3].trim()); rowList.add(new RowData(a, b, c, d)); } } } catch (IOException | NumberFormatException e) { e.printStackTrace(); } // 执行排序 sortRowList(rowList); // 打印排序后的结果验证 for (RowData row : rowList) { System.out.println(row); } } }
第三步:按d→c→b→a的规则排序
现在咱们实现排序逻辑,核心是自定义一个Comparator,按照d、c、b、a的优先级依次比较:
方式一:传统Comparator实现
private static void sortRowList(ArrayList<RowData> rowList) { rowList.sort(new Comparator<RowData>() { @Override public int compare(RowData r1, RowData r2) { // 先比较d:r1.d < r2.d 返回负数(r1排前面),相等则继续 int dCompare = Integer.compare(r1.getD(), r2.getD()); if (dCompare != 0) { return dCompare; } // d相等,比较c int cCompare = Integer.compare(r1.getC(), r2.getC()); if (cCompare != 0) { return cCompare; } // c相等,比较b int bCompare = Integer.compare(r1.getB(), r2.getB()); if (bCompare != 0) { return bCompare; } // 最后比较a return Integer.compare(r1.getA(), r2.getA()); } }); }
方式二:Java 8+ 链式写法(更简洁)
如果用Java 8及以上版本,咱们可以用Comparator.comparing的链式调用,代码更清爽:
private static void sortRowList(ArrayList<RowData> rowList) { rowList.sort(Comparator.comparing(RowData::getD) .thenComparing(RowData::getC) .thenComparing(RowData::getB) .thenComparing(RowData::getA)); }
注意哦:上面的排序是升序(小的在前),完全符合你描述的“行1的d值小于行2的d值则返回特定值”的需求;如果需要降序,只需要在每个比较方法后面加.reversed()即可,比如Comparator.comparing(RowData::getD).reversed()。
内容的提问来源于stack exchange,提问作者Abby
相关产品推荐
相关产品推荐

