如何根据对象的属性在Kotlin中重新排列ArrayList的顺序?

时间:2019-03-06 04:01:23

标签: android kotlin

我有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的新手。

3 个答案:

答案 0 :(得分:0)

您可以将sortedWithcompareBy一起使用,如下所示:

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