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

Java含时间戳与文本的列表逆序排序异常问题求助

解决方案

原来的排序代码是针对纯数字+文本的场景设计的,正则\d[\d,]*只能匹配带逗号的纯数字字符串,但你的时间戳包含-和:,会被判定为非数字文本。加上前缀空格后,空格的ASCII码小于数字2,导致文本的排序键比时间戳更小,调用reversed()后文本就跑到了前面,不符合你的需求。

要实现**时间戳在前、文本在后,且时间戳按逆序(最新时间在前)**的排序效果,需要先区分时间戳和非时间戳,再分别制定排序规则:

步骤1:识别合法时间戳

用DateTimeFormatter解析字符串,判断是否符合yyyy-MM-dd HH:mm:ss格式,比正则更能避免无效日期的误判:

private static boolean isTimestamp(String s) {
    try {
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").parse(s);
        return true;
    } catch (DateTimeParseException e) {
        return false;
    }
}

步骤2:自定义排序逻辑

通过Comparator实现分组排序:

  • 优先将时间戳排在非时间戳前面
  • 时间戳内部按字符串逆序比较(ISO格式的时间戳字符串字典序与时间顺序一致,逆序后就是最新时间在前)
  • 非时间戳文本可保持原顺序,或按字典序调整(示例中保持原顺序)

完整排序代码:

List<String> sortValues = new ArrayList<>(List.of(
        "2023-10-04 18:05:12", "2023-10-04 18:06:22", "2023-10-04 18:04:12",
        "Unknown", "2023-10-04 17:05:45", "2023-10-04 18:04:45", "Error"
));

sortValues.sort((s1, s2) -> {
    boolean ts1 = isTimestamp(s1);
    boolean ts2 = isTimestamp(s2);
    
    // 分组:时间戳在前,非时间戳在后
    if (ts1 && !ts2) return -1;
    if (!ts1 && ts2) return 1;
    
    // 时间戳内部逆序排序
    if (ts1) return s2.compareTo(s1);
    
    // 非时间戳保持原顺序
    return Integer.compare(sortValues.indexOf(s1), sortValues.indexOf(s2));
});

// 输出结果:[2023-10-04 18:06:22, 2023-10-04 18:05:12, 2023-10-04 18:04:45, 2023-10-04 18:04:12, 2023-10-04 17:05:45, Unknown, Error]
System.out.println(sortValues);

可选调整

如果需要非时间戳文本按字典序逆序排列,将最后一段替换为:

return s2.compareTo(s1);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:05:24