Как изменить порядок ArrayList в Kotlin на основе свойства объекта? - PullRequest
0 голосов
/ 06 марта 2019

У меня есть ChatMessage класс, как в коде ниже:

class ChatMessage(val uid: String, val text: String, val fromId: String, val toId: String, val timestamp: Long) {}

имеет timestamp в качестве свойства

У меня есть пустой список, подобный этому, позже я заполню этот список сообщений данными:

val messageList = ArrayList<ChatMessage>()

и я хочу изменить это messageList на основе отметки времени, поэтому самая низкая отметка времени будет в индексе 0 этого массива.

как это сделать в Котлине? Прошу прощения, если это тривиально, я новичок в программировании и в Kotlin.

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

Вы можете использовать функцию сортировки из стандартной библиотеки Kotlin .

Допустим, вам нужно messageList отсортировать по временной метке, а затем использовать следующий синтаксис:

val sortedList :List<ChatMessage> = messageList.sortedBy { chatMessage :ChatMessage -> chatMessage.timestamp }

Приведенный выше фрагмент кода вернет вам отсортированный List<ChatMessage>, который вы можете использовать в дальнейшем.

Узнайте больше здесь .

0 голосов
/ 06 марта 2019

Добро пожаловать в Kotlin

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>:

val container = MessageContainer()
repeat(20) {
    container.addMessage(ChatMessage("text$it", (10L..10_000L).random()))
}
container.getAllMessages() //will be ordered
0 голосов
/ 06 марта 2019

Вы можете использовать sortedWith с compareBy следующим образом:

val sortedList = messageList.sortedWith(compareBy({ it.timestamp }))

Вы даже можете сортировать по нескольким свойствам:

val sortedList = messageList.sortedWith(compareBy({ it.timestamp }, { it.fromId }))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...