web-dev-qa-db-fra.com

Expressions d'objet Kotlin: exemple de comparateur

Ce code trie fondamentalement le tableau dans un ordre décroissant:

val arrayList = arrayListOf(1, 5, 2)

Collections.sort(arrayList, object : Comparator<Int> {
   override fun compare(x : Int, y: Int) = y - x
})

Comment fonctionne le remplacement de la méthode de comparaison avec y - x par le monde? Comment Kotlin sait-il ce que y - x signifie mettre y avant x si y < x?

11
Rafael Saraiva

Cela n'a en fait rien à voir avec Kotlin. Cela est lié à l'interface de comparaison de l'API Java et à la façon dont Collections.sort l'utilise.

De la documentation:

Compare ses deux arguments pour order. Renvoie un entier négatif, Zéro ou un entier positif, car le premier argument est inférieur à, égal à Ou supérieur au second.

Essayons maintenant ceci pour les arguments que vous avez donnés: 

  • 1 - 5 = -4 (un entier négatif), donc 1 est inférieur à 5.
  • 5 - 2 = 3 (un entier positif), donc 5 est supérieur à 2.
  • etc...

Collections.sort ne sait rien de ce que y - x . Il respecte simplement le contrat défini de l'interface de comparaison que tout implémenteur doit également respecter (s'il veut fonctionner). 

Il se trouve que y - x est une implémentation qui respecte ce contrat, parce que Math.

16
eski

Puisque Comparator est une interface SAM, vous pouvez écrire ce code plus concis en utilisant un lambda:

Collections.sort(arrayList, {x : Int, y: Int -> y - x})

Ou même

Collections.sort(arrayList) {
    x, y -> y - x
}

puisque lambda est le dernier paramètre de la fonction sort et que le type de données x et y peut être déduit.


Prendre deux objets et avoir à définir un seul entier pour eux est une abstraction d'une définition de tri. Vous spécifiez essentiellement dans quel ordre ces éléments seront disposés s'ils sont triés.

Pour trier des entiers, cela peut sembler excessif, mais envisagez de trier des objets plus complexes, par exemple des instances d'une classe Car.

Cette classe a une colorCode et vous voulez trier par ceci: 

Collections.sort(cars) {
    car1, car2 -> car1.colorCode - car2.colorCode
}

C'est ainsi que vous définiriez un ordre pour ces objets de manière abstraite.

2
Willi Mentzel

Dans Kotlin, vous pouvez également trier les éléments à l’aide des fonctions d’extension de collections Kotlin, trier, trier, trier, etc.

val arrayList = arrayListOf(1, 5, 2).sorted() //1,2,5

ou

val arrayList = arrayListOf(1, 5, 2).sortedDescending() //5,2,1
0
Fredy Mederos