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
相关产品推荐
相关产品推荐

