我有ChatMessage
类,如下面的代码:
class ChatMessage(val uid: String, val text: String, val fromId: String, val toId: String, val timestamp: Long) {}
它具有timestamp
作为其属性
我有一个这样的空列表,稍后我将用数据填充此messageList:
val messageList = ArrayList<ChatMessage>()
并且我想根据时间戳重新排列messageList
,因此最低的时间戳将在该数组的索引0中。
如何在Kotlin中做到这一点?很抱歉,这很简单,我是编程和Kotlin的新手。
答案 0 :(得分:0)
您可以将sortedWith
与compareBy
一起使用,如下所示:
val sortedList = messageList.sortedWith(compareBy({ it.timestamp }))
您甚至可以按多个属性进行排序:
val sortedList = messageList.sortedWith(compareBy({ it.timestamp }, { it.fromId }))
答案 1 :(得分:0)
您可以使用 Kotlin标准库中的排序功能。
比方说,您的messageList
需要根据时间戳进行排序,然后使用以下语法:
val sortedList :List<ChatMessage> = messageList.sortedBy { chatMessage :ChatMessage -> chatMessage.timestamp }
上面的代码将返回经过排序的List<ChatMessage>
,您可以进一步使用它。
了解更多 here 。
答案 2 :(得分:0)
欢迎来到科特林
1)如果一个类的花括号为空,则可以省略,而您的ChatMessage
似乎很适合于数据类:
data class ChatMessage(val uid: String, val text: String, val fromId: String, val toId: String, val timestamp: Long)
2)您可以创建一个容器,用于收集有序PriorityQueue
中的所有消息,尤其是在仅需要有序的情况下。看起来可能像这样:
class MessageContainer {
private val messageList = PriorityQueue<ChatMessage>(Comparator { c1: ChatMessage, c2: ChatMessage ->
c1.timestamp.compareTo(c2.timestamp)
})
fun addMessage(msg: ChatMessage) = messageList.offer(msg)
fun getAllMessages(): List<ChatMessage> {
val ordered = mutableListOf<ChatMessage>()
while (!messageList.isEmpty()) ordered.add(messageList.remove())
return ordered.toList()
}
}
现在,如果您通过ChatMessage
插入addMessage
的对象,则它们将直接在队列中排序,并且当您调用getAllMessages
时,会收到有序的List<ChatMessage>
:< / p>
val container = MessageContainer()
repeat(20) {
container.addMessage(ChatMessage("text$it", (10L..10_000L).random()))
}
container.getAllMessages() //will be ordered