Guide de tri à Kotlin

Guide de tri à Kotlin

1. Vue d'ensemble

Kotlin s'appuie sur le framework Java Collection en utilisantextension methods. Cela améliore considérablement la convivialité et la lisibilité sans avoir besoin de dépendances tierces telles queApache Commons ouGuava.

Dans ce didacticiel, nous allons nous concentrer sur le tri dans Kotlin. Nous utiliserons également le packagekotlin.comparisons pour implémenter des règles de tri complexes.

2. Tri d'une collection

Kotlin fournit plusieurs utilitaires pour faciliter le processus de tri des collections. Explorons plusieurs de ces méthodes.

2.1. Sort

The simplest way to sort a collection is to call the sort method. Cette méthode utilisera l'ordre naturel des éléments. De plus, il sera ordonné dans le sens ascendant par défaut, donc "a" est avant "b" et "1" est avant "2":

val sortedValues = mutableListOf(1, 2, 7, 6, 5, 6)
sortedValues.sort()
println(sortedValues)

Et le résultat du code ci-dessus est:

[1, 2, 5, 6, 6, 7]

Il est important de noter que nous avons utilisé une collection mutable. La raison en est quethe sort method will sort in-place. Si nous voulons que le résultat soit renvoyé sous forme de nouvelle liste, nous devons simplement utiliser la méthodesorted à la place.

De plus, nous pouvons utiliser les méthodessortDescending oureverse pour trier par ordre décroissant.

2.2. SortBy

Si nous avons besoin de trier par propriétés spécifiques d'un objet donné, nous pouvons utilisersortBy. The sortBy method allows us to pass a selector function as an argument. La fonction de sélection recevra l'objet et devrait renvoyer la valeur sur laquelle nous souhaitons trier:

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e")
sortedValues.sortBy { it.second }
println(sortedValues)

Et le résultat du code ci-dessus est:

[(1, a), (2, b), (7, c), (5, c), (6, d), (6, e)]

Encore une fois, la collection doit être modifiable car la méthodesortBy effectuera un tri sur place. Si nous voulons que le résultat soit renvoyé sous la forme d'une nouvelle liste, nous devons utiliser la méthodesortedBy au lieu de la méthodesortBy.

Comme auparavant, par ordre décroissant, nous pouvons utiliser les méthodessortByDescending oureverse.

2.3. SortWith

Pour une utilisation plus avancée (pour combiner plusieurs règles, par exemple), nous pouvons utiliser la méthodesortWith.

Nous pouvons passer un objetComparator comme argument. Dans Kotlin, nous avons plusieurs façons de créer des objetsComparator et nous en parlerons dans la section suivante:

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e")
sortedValues.sortWith(compareBy({it.second}, {it.first}))
println(sortedValues)

Et le résultat du code ci-dessus est qu’ils sont triés par lettre puis par numéro:

[(1, a), (2, b), (5, c), (7, c), (6, d), (6, e)]

Comme lessortWith feront le tri sur place, nous devons utiliser une collection modifiable. Si nous voulons que le résultat soit renvoyé comme une nouvelle collection, nous devons utiliser la méthodesortedWith au lieu de la méthodesortWith.

Pour l'ordre décroissant, nous pouvons utiliser la méthodereverse ou définir les bonsComparator.

3. Comparaison

Kotlin contient un package très utile pour construire unComparator -kotlin.comparisons. Dans les sections suivantes, nous aborderons:

  • Création deComparator

  • Traitement des valeursnull

  • Inverser l'ordre

  • Extension de règlesComparator

3.1. Création deComparator

Afin de simplifier la création de notreComparator, Kotlin apporte de nombreuses méthodes d'usine pour rendre notre code plus expressif.

L'usineComparator la plus simple disponible estnaturalOrder(). Aucun argument n'est nécessaire et l'ordre est croissant par défaut:

val ascComparator = naturalOrder()

Pour les objets avec plusieurs propriétés, nous pouvons utiliser la méthodecompareBy. En arguments, nous donnons un nombre variable de fonctions (règles de tri) qui renverront chacune un objetComparable. Ensuite, ces fonctions seront appelées séquentiellement jusqu'à ce que l'objetComparable résultant soit évalué comme non égal ou jusqu'à ce que toutes les fonctions soient appelées.

Dans l'exemple suivant, la valeurit.first est utilisée pour les comparaisons et, uniquement lorsque les valeurs sont égales,it.second sera appelé pour briser l'égalité:

val complexComparator = compareBy>({it.first}, {it.second})

N'hésitez pas à explorerkotlin.comparisons pour découvrir toutes les usines disponibles.

3.2. Traitement des valeursnull

Un moyen simple d'améliorer nosComparator avec la gestion des valeurs denull est d'utiliser les méthodesnullsFirst ounullsLast. Ces méthodes trieront respectivement les valeursnull à la première ou à la dernière place:

val sortedValues = mutableListOf(1 to "a", 2 to null, 7 to "c", 6 to "d", 5 to "c", 6 to "e")
sortedValues.sortWith(nullsLast(compareBy { it.second }))
println(sortedValues)

Le résultat du code ci-dessus sera:

[(1, a), (7, c), (5, c), (6, d), (6, e), (2, null)]

Nous pouvons voir que la dernière valeur de la collection résultante est celle avec la valeurnull.

3.3. Inverser l'ordre

Pour inverser l'ordre, nous pouvons utiliser la méthodereverseOrder ou la méthodereversed. La première méthode n'a pas d'arguments et renvoie un ordre décroissant. Cette dernière méthode peut être appliquée sur un objetComparator et elle retournera son objetComparator inversé.

Pour construire unComparator en utilisant l'ordre naturel décroissant, nous pouvons faire:

reverseOrder()

3.4. Extension des règles de comparaison

Les objetsComparator peuvent être combinés ou étendus avec des règles de tri supplémentaires via les méthodesthen disponibles dans le packagekotlin.comparable.

Ce n'est que lorsque le premier comparateur est égal à égal que le second comparateur sera utilisé.

Notre liste d'étudiants contient un âge et un nom pour chaque individu. Nous voulons qu'ils soient classés du plus jeune au plus vieux et, quand ils ont le même âge, par ordre décroissant de nom:

val students = mutableListOf(21 to "Helen", 21 to "Tom", 20 to "Jim")

val ageComparator = compareBy> {it.first}
val ageAndNameComparator = ageComparator.thenByDescending {it.second}
println(students.sortedWith(ageAndNameComparator))

Le résultat du code ci-dessus sera:

[(20, Jim), (21, Tom), (21, Helen)]

4. Conclusion

Dans ce rapide tutoriel, nous avons vu comment utiliser les méthodessort,sortBy etsortWith afin de trier les collections dans Kotlin.

Plus tard, nous avons également utilisé le packagekotlin.comparisons pour créer des objetsComparator et les améliorer avec des règles de tri supplémentaires.

L'implémentation de tous ces exemples et extraits de code peut être trouvéeover on GitHub.