尝试对具有时间戳和文本的列表进行反向排序

问题描述 投票:0回答:1

我正在尝试使用反向排序代码对具有日期和时间戳值的列表进行反向排序:

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 示例(即排序前):

[Unknown, Unknown, 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","Unknown","2023-10-04 17:05:45","2023-10-04 18:04:45","2023-10-04 18:04:47","2023-10-04 18:03:15", "Error"]

使用上面的代码,当存在类似于 示例 1(数字)中的值时,排序将按预期工作(数字在前,文本值在末尾)。

但是,当我像示例 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]

而预期的反向排序应该首先是时间/日期格式,然后是文本。

谢谢您,我很感谢您的帮助。

java regex list sorting
1个回答
0
投票

您可以利用 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
© www.soinside.com 2019 - 2024. All rights reserved.