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

按对象属性子串排序对象列表:寻求更优实现方案

按日期字符串的日部分排序对象列表的优化方案

首先要提个小细节:你示例里的日期字符串"Thu Oct 26 2023",如果用substring(8,9)只能取到字符"2",而不是你想要的26,应该用substring(8,10)才能拿到完整的日部分,这个点得先修正,否则排序逻辑会出错。

针对你的需求,有几种比手动写Comparator更简洁或性能更优的方式:

1. 缓存日部分到对象(性能最优)

如果你的对象可以修改,建议在对象初始化时就把日部分解析为int并缓存起来,避免排序时重复解析字符串——这在列表元素较多时能显著提升性能。

示例代码:

class YourObject {
    private String date;
    private int dayOfMonth; // 缓存解析后的日部分

    public YourObject(String date) {
        this.date = date;
        // 提取日部分并解析,trim避免可能的空格
        this.dayOfMonth = Integer.parseInt(date.substring(8, 10).trim());
    }

    public int getDayOfMonth() {
        return dayOfMonth;
    }
}

排序时直接用缓存的int字段比较,代码简洁且高效:

Collections.sort(yourObjectList, Comparator.comparingInt(YourObject::getDayOfMonth));

2. 简化Comparator写法(无需修改对象)

如果不能修改对象,可以用Java 8+的Comparator.comparingInt方法简化代码,比手动实现Comparator更易读:

Collections.sort(yourObjectList, Comparator.comparingInt(obj -> 
    Integer.parseInt(obj.getDate().substring(8, 10).trim())
));

这种方式省去了手动写compare方法的冗余代码,逻辑清晰。

注意事项

  • 不要直接用字符串子串的字典序比较:比如"5"和"26",字典序"26"会排在"5"前面,但数值上5<26,必须解析为int才能得到正确的排序结果。
  • 处理边界情况:如果日期的日部分是一位数(比如"Thu Oct 5 2023"),substring(8,10)会取到"5 ",所以必须用trim()去掉空格再解析,避免抛出NumberFormatException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:20:19