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

Iva*_*ers 7 sorting date kotlin

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

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

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

排序这些最干净(最实用)的方法是什么?(所以fe有一种方法,我不必采取当天,月等的子串,将它们转换为a Int,在嵌套循环中比较它们并将结果写入不同的数组?(这是我唯一的方法可以想到).

Gar*_* LO 8

可以使用多种方法.这取决于您获得排序结果后的处理方式.

注意事项:

  • java.time.LocalDateTime已经实现了 java.lang.Comparable<T>Interface.我们可以使用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>
Run Code Online (Sandbox Code Playgroud)

最简单的方法是直接转换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)
Run Code Online (Sandbox Code Playgroud)

如果你想使用org.joda.time.DateTime,你只需对转换功能进行微小的改动.

一个友好的提醒,总是val选择在Kotlin :)的第一选择.

  • 但是,呼叫需要API级别26.任何向后兼容的解决方 (5认同)
  • @elect不可变对象总是更容易跟踪,可以在多线程环境中使用而不用担心.如果您熟悉功能方法,大多数时候您不需要在Kotlin中使用`var`.但是`var`的内存效率更高,明智地使用它来获取唯一的好处. (2认同)