我正在尝试创建一个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
,在嵌套循环中比较它们并将结果写入不同的数组?(这是我能想到的唯一方法。)
答案 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
}