首页 > 解决方案 > 在Java中按字符串中的2个子字符串排序

问题描述

我正在尝试根据字符串的 2 个组件以相反的顺序对字符串列表(在 Java 中)进行排序,第一个是月份(需要按时间倒序排序),第二个是开始时的整数值字符串(不代表日期,因此可能超过 31)。例如:

List<String> dates = List.of("13 Dec", "44 Jun", "12 Dec", "103 Aug", "22 Sep", "23 Sep");

订购后应返回:

[13 Dec, 12 Dec, 23 Sep, 22 Sep, 103 Aug, 44 June]

谁能告诉我一个如何做到这一点的例子?谢谢

标签: javasortingcomparator

解决方案


这是一种方法。它使用一些java.time特性来获取月份的值。

List<String> dates = new ArrayList<>(List.of("13 Dec",
        "44 June", "12 Dec", "103 Aug", "22 Sep", "23 Sep"));

首先,使用 DateTimeFormatter 获取等值的整数月。这避免了创建外部数据结构来保存月份。

Function<String, Integer> monNum = month -> DateTimeFormatter
        .ofPattern("MMM").parse(month)
        .get(ChronoField.MONTH_OF_YEAR);

然后构造一个比较器来比较字符串,首先按月份,然后按数字,两者都以相反的顺序进行。

Comparator<String> comp =
    Comparator.comparing((String str) -> str.split("\\s+"),
        Comparator.comparingInt((String[] a) -> monNum.apply(a[1]))
            .thenComparing(a -> Integer.parseInt(a[0])))
         .reversed();
        
dates.sort(comp);
System.out.println(dates);

印刷

[13 Dec, 12 Dec, 23 Sep, 22 Sep, 103 Aug, 44 June]

推荐阅读