1
votes

comment réorganiser l'ordre de ArrayList dans Kotlin en fonction de la propriété de l'objet?

J'ai une classe ChatMessage comme le code ci-dessous:

val messageList = ArrayList<ChatMessage>()

elle a horodatage comme propriété

J'ai une liste vide comme celle-ci, plus tard, je remplirai cette liste de messages avec les données:

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

et je veux réorganiser cette messageList en fonction du horodatage, donc l'horodatage le plus bas sera dans l'index 0 de ce tableau.

comment faire cela dans Kotlin? Je suis désolé si c'est trivial, je suis nouveau dans la programmation et dans Kotlin.


0 commentaires

3 Réponses :


2
votes

Vous pouvez utiliser sortedWith avec compareBy comme ceci:

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

Vous pouvez même trier par plusieurs propriétés:

XXX


0 commentaires

2
votes

Vous pouvez utiliser la fonction de tri de la bibliothèque standard Kotlin .

Disons que votre messageList doit trier en fonction de l'horodatage, puis utilisez la syntaxe suivante ci-dessous: p>

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

Le morceau de code ci-dessus vous renverra une List triée que vous pourrez utiliser ultérieurement.

En savoir plus ici .


0 commentaires

0
votes

Bienvenue dans Kotlin

1) Vous pouvez omettre les accolades pour une classe si elles sont vides, aussi votre ChatMessage semble être un bon ajustement pour une classe de données:

val container = MessageContainer()
repeat(20) {
    container.addMessage(ChatMessage("text$it", (10L..10_000L).random()))
}
container.getAllMessages() //will be ordered

2) Vous pouvez créer un conteneur que vous utiliserez pour collecter tous les messages dans une PriorityQueue ordonnée, surtout si vous n'en avez besoin que commandée. Cela pourrait ressembler à ceci:

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()
    }
}

Maintenant, si vous insérez des objets de ChatMessage via addMessage , ils seront classés dans la file d'attente directement et lorsque vous invoquez getAllMessages , vous recevez une List:

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


0 commentaires