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

时间:2016-10-14 14:52:43

标签: sorting date kotlin

我正在尝试创建一个Kotlin REST API,它从PostgreSQL数据库中检索值。现在这些结果中的值是f.e. "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")

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

5 个答案:

答案 0 :(得分:6)

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

注意事项:

  • 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,您只需对转换功能进行微小更改即可。

友情提醒,总是选择val作为您在Kotlin的首选:)。

答案 1 :(得分:1)

卓越的Saravana答案的另一种选择(对于像我这样的极简主义和紧凑型怪胎......)是:

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是单个输入的默认变量

答案 2 :(得分:0)

您可以使用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]

<强>更新

您只需在LocalDateTime单独转换为Comparator

即可
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]

答案 3 :(得分:0)

如果您使用自定义对象日期列表,排序如下。

println("--- ASC ---")  
dates.sortBy { it.year }
println("--- DESC ---")
dates.sortByDescending { it.year }

您可以使用 sortByDescending {it.field} 进行降序。

答案 4 :(得分:-1)

class ChatUser{   
  var Sender:String=""   
  var Reciever:String=""  
  var Message:String=""                                   
  var Hours:String=""  
  var Minutes:String=""  
  var Seconds:String=""    
  var Day:String=""           
  var Month:String=""  
  var Year:String=""   
  var Uuid:String="" 
}


fun SortMessage( listOfChat: ArrayList<ChatUser>):ArrayList<ChatUser>{

 for(i:Int in 0 until ( listOfChat.size-1)){

   for(j in 0 until(listOfChat.size-i-1)){



       if(listOfChat[j].Year.toInt()==listOfChat[j+1].Year.toInt()){

           if(listOfChat[j].Month.toInt()==listOfChat[j+1].Month.toInt()){

               if(listOfChat[j].Day.toInt()==listOfChat[j+1].Day.toInt()){

                   if(listOfChat[j].Hours.toInt()==listOfChat[j+1].Hours.toInt()){

                       if(listOfChat[j].Minutes.toInt()==listOfChat[j+1].Minutes.toInt()){

                           if(listOfChat[j].Seconds.toInt()==listOfChat[j+1].Seconds.toInt()){

                             try {
                                 Log.i("Detail","Both messages are send at same time")

                             }catch (ex:Exception){}
                           }
                           else  if(listOfChat[j].Seconds.toInt()>listOfChat[j+1].Seconds.toInt()){

                               var temp=listOfChat[j]
                               listOfChat[j]=listOfChat[j+1]
                               listOfChat[j+1]=temp
                           }


                       }
                       else  if(listOfChat[j].Minutes.toInt()>listOfChat[j+1].Minutes.toInt()){

                           var temp=listOfChat[j]
                           listOfChat[j]=listOfChat[j+1]
                           listOfChat[j+1]=temp


                       }

                   }
                   else  if(listOfChat[j].Hours.toInt()>listOfChat[j+1].Hours.toInt()){

                       var temp=listOfChat[j]
                       listOfChat[j]=listOfChat[j+1]
                       listOfChat[j+1]=temp

                   }


               }
               else  if(listOfChat[j].Day.toInt()>listOfChat[j+1].Day.toInt()){

                   var temp=listOfChat[j]
                   listOfChat[j]=listOfChat[j+1]
                   listOfChat[j+1]=temp

               }



           }else  if(listOfChat[j].Month.toInt()>listOfChat[j+1].Month.toInt()){

               var temp=listOfChat[j]
               listOfChat[j]=listOfChat[j+1]
               listOfChat[j+1]=temp

           }


       }else if(listOfChat[j].Year.toInt()>listOfChat[j+1].Year.toInt()){

           var temp=listOfChat[j]
           listOfChat[j]=listOfChat[j+1]
           listOfChat[j+1]=temp


       }
   }
}
return listOfChat
}