Kotlin – 使用格式化日期字符串排序列表(功能)

我正在尝试创建一个Kotlin REST API,它从PostgreSQL数据库中检索值。 现在这些结果的值是fe "14-10-2016 | 15:48""01-08-2015 | 09:29"所以语法基本上是dd-MM-yyyy | hh:mm dd-MM-yyyy | hh:mm

现在我想要做的是创建一个函数,将按日期排序。 (假设这些字符串是在一个数组中)

 var list = listOf("14-10-2016 | 15:48", "01-08-2015 | 09:29", "15-11-2016 | 19:43") 

什么是最清洁(和最功能)的方式来排序这些? (所以有没有一种方法,我不必采取一天,一个月的子字符串,等他们转换为一个Int ,比较它们在嵌套循环,并将结果写入不同的数组?(这是唯一的方法我能想到)。

可以使用多种方法。 这取决于你得到排序结果后如何处理。

注意事项:

  • java.time.LocalDateTime已经实现了java.lang.Comparable<T>接口。 我们可以使用kotlin stdlib List.sortBy直接对List<LocalDateTime>进行排序。

参考:

 // https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/sorted-by.html fun <T, R : Comparable<R>> Iterable<T>.sortedBy( selector: (T) -> R? ): List<T> 

最简单的方法是转换String -> java.time.LocalDateTime并直接使用List.sortBy

整个实现可能是这样的:

  import java.time.LocalDateTime import java.time.format.DateTimeFormatter ... // Create a convert function, String -> LocalDateTime val dateTimeStrToLocalDateTime: (String) -> LocalDateTime = { LocalDateTime.parse(it, DateTimeFormatter.ofPattern("dd-MM-yyyy | HH:mm")) } val list = listOf("14-10-2016 | 15:48", "01-08-2015 | 09:29", "15-11-2016 | 19:43") // You will get List<LocalDateTime> sorted in ascending order list.map(dateTimeStrToLocalDateTime).sorted() // You will get List<LocalDateTime> sorted in descending order list.map(dateTimeStrToLocalDateTime).sortedDescending() // You will get List<String> which is sorted in ascending order list.sortedBy(dateTimeStrToLocalDateTime) // You will get List<String> which is sorted in descending order list.sortedByDescending(dateTimeStrToLocalDateTime) 

如果你想使用org.joda.time.DateTime ,你可以对convert函数做一个微小的改变。

友善的提醒,总是选择val作为您在Kotlin的第一选择:)。

另一个选择萨拉瓦纳优秀的答案(对于我这样的极简主义和紧凑的怪胎)是:

 val cmp = compareBy<String> { LocalDateTime.parse(it, DateTimeFormatter.ofPattern("dd-MM-yyyy | HH:mm")) } list.sortedWith(cmp).forEach { ::println } 01-08-2015 | 09:29 14-10-2016 | 15:48 15-11-2016 | 19:43 

Ps: it是单个输入的默认变量

您可以使用DateTimeFormatter解析,然后与LocalDateTime进行比较

  List<String> dates = Arrays.asList("14-10-2016 | 15:48", "01-08-2015 | 09:29", "15-11-2016 | 19:43"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy | HH:mm"); List<LocalDateTime> dateTimes = dates.stream().map(date -> LocalDateTime.parse(date, formatter)).sorted().collect(Collectors.toList()); System.out.println(dateTimes); 

产量

 [2015-08-01T09:29, 2016-10-14T15:48, 2016-11-15T19:43] 

更新

您可以简单地在Comparator单独转换为LocalDateTime

 List<String> sortedDates = dates.stream().sorted(Comparator.comparing(date -> LocalDateTime.parse(date, formatter))).collect(Collectors.toList()); 

产量

 [01-08-2015 | 09:29, 14-10-2016 | 15:48, 15-11-2016 | 19:43]