JavaFX中按字符串日期排序ObservableList的实现方案
JavaFX TableView 按日期字符串排序解决方案
不管是在Controller里直接排序ObservableList,还是读取CSV时完成排序,核心都是把"dd-MM-yyyy"格式的字符串转成日期对象后再比较——直接比字符串会因为格式顺序(天-月-年)导致排序逻辑错误。
方案一:在Controller中排序ObservableList
直接对已有的ObservableList<Stock>调用sort()方法,传入自定义Comparator,内部将字符串日期转为LocalDate再比较:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import javafx.collections.ObservableList; // 假设stockList是你的ObservableList<Stock>实例 DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); stockList.sort((stock1, stock2) -> { // 解析字符串为LocalDate LocalDate date1 = LocalDate.parse(stock1.getDateRN(), dateFormatter); LocalDate date2 = LocalDate.parse(stock2.getDateRN(), dateFormatter); // 按日期升序排序,倒序的话用date2.compareTo(date1) return date1.compareTo(date2); });
如果CSV里可能存在格式错误的日期字符串,建议加异常处理避免崩溃:
stockList.sort((stock1, stock2) -> { try { LocalDate date1 = LocalDate.parse(stock1.getDateRN(), dateFormatter); LocalDate date2 = LocalDate.parse(stock2.getDateRN(), dateFormatter); return date1.compareTo(date2); } catch (Exception e) { // 处理格式错误,比如把无效日期放到末尾 return 1; } });
方案二:读取CSV时完成排序
在读取CSV并转换为Stock对象的阶段,先把所有Stock存入普通List,排序后再转为ObservableList:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import javafx.collections.FXCollections; import javafx.collections.ObservableList; // 1. 读取CSV并解析为Stock对象,存入临时List List<Stock> tempStockList = new ArrayList<>(); // 这里替换成你的CSV读取逻辑,比如用BufferedReader逐行读取解析 // tempStockList.add(new Stock(...)); // 2. 对临时List排序 DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); tempStockList.sort((s1, s2) -> { LocalDate date1 = LocalDate.parse(s1.getDateRN(), dateFormatter); LocalDate date2 = LocalDate.parse(s2.getDateRN(), dateFormatter); return date1.compareTo(date2); }); // 3. 转为ObservableList供TableView使用 ObservableList<Stock> stockList = FXCollections.observableArrayList(tempStockList);
补充:之前Comparator失败的常见原因
如果之前直接对dateRN字符串做比较,比如Comparator.comparing(Stock::getDateRN),会因为字符串的排序逻辑(先比日,再比月,最后比年)导致日期顺序错误。比如"31-12-2022"字符串会比"01-01-2023"大,但实际日期更早,必须转成日期对象再比较才能得到正确的时间顺序。
内容的提问来源于stack exchange,提问作者user17067764
相关产品推荐
相关产品推荐

