我正在尝试使用反向排序代码对具有日期和时间戳值的列表进行反向排序:
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"));
@Bohemian 给出的代码,非常感谢,非常感谢您的帮助。
sortValues.sort(Comparator.<String, String>comparing(s -> !s.matches("\\d[\\d,]*") ? " " + s : String.format("%09d", Integer.parseInt(s.replace(",", "")))).reversed());
例如:1[未知、未知、13,125、65,029、280,552、281,012、987,072、988,775、1,250,203、2,363,356、4,042,563]
例如:2 [“2023-10-04 18:05:12”,“2023-10-04 18:06:22”,“2023-10-04 18:04:12”,“未知”,“2023 -10-04 17:05:45","2023-10-04 18:04:45","2023-10-04 18:04:47","2023-10-04 18:03:15", “错误”]
使用上面的代码,当存在类似于 eg1(数字)中的值时,排序将按预期工作(数字在前,文本值在末尾)
但是当我对日期和时间戳值进行反向排序时,如 eg 2: 上面的代码首先排序并显示文本值,然后在文本后面显示日期和时间戳。下面是例子。
[Unknown, Error, 2023-10-04 18:06:22, 2023-10-04 18:05:12, 2023-10-04 18:04:47, 2023-10-04 18:04:45, 2023-10-04 18:04:12, 2023-10-04 18:03:15, 2023-10-04 17:05:45]
预期的反向排序应该首先是时间/日期格式,然后是文本。
谢谢你,我很感谢你的帮助。
您可以利用 DateTimeFormatter 类来评估每个条目。
这是一个例子。
DateTimeFormatter f = DateTimeFormatter.ISO_DATE_TIME;
sortValues.sort((a, b) -> {
try {
LocalDateTime t = (LocalDateTime) f.parse(a);
try {
return t.compareTo((LocalDateTime) f.parse(b));
} catch (DateTimeParseException e) {
return 1;
}
} catch (DateTimeParseException e) {
try {
f.parse(b);
return -1;
} catch (DateTimeParseException ee) {
return a.compareTo(b);
}
}
});
并且,要按相反顺序排序,请随后调用 sort。
sortValues.sort(Comparator.reverseOrder());
输出
2023-10-04 17:05:45
2023-10-04 18:04:12
2023-10-04 18:04:45
2023-10-04 18:05:12
2023-10-04 18:06:22
Error
Unknown
Unknown
Error
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