java - 在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]
谁能告诉我一个如何做到这一点的例子?谢谢
解决方案
这是一种方法。它使用一些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]
推荐阅读
- google-sheets - SUMIF、INDEX、MATCH 多列和多行
- python - Pandas Tkinter Excel Data Cleaner GUI - 需要大师给新手一些改进的技巧
- oracle - SQL Developer 显示日期不正确
- javascript - 选择特定选项时的 Javascript 禁用按钮
- windows - 比较两个时间服务器之间的时间差
- excel-formula - VLOOKUP 或 INDEX-MATCH 用于从底部到顶部的文本,参考工作簿中的另一个工作表
- sql - 如何在 SQL 中使用 while 循环根据日期迭代字符串文字
- c++ - 共享内存和性能
- sql - 带有子查询的 SQL Server CASE 语句 then
- https - “webdev serve” chrome 在使用 https 时不会显示 dart 源