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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:30:23