web-dev-qa-db-fra.com

Quel est l'ordre de tri de Collections.sort de Java (liste, comparateur)? petit à grand ou grand à petit?

Apparemment, ce n'est pas documenté ou je l'ai manqué.

Ici est le lien vers la documentation et ci-dessous le texte sous forme d'image:

[~ # ~] modifier [~ # ~] (17/5): Je pense que trop de gens ont confondu cette question pour être une question de comparaison. Ce n'est pas. Le comparateur compare entre 2 éléments. Selon cette comparaison, la liste a été triée. Comment? Croissant ou décroissant?

Je vais affiner/simplifier la question encore plus: si le comparateur décide que l'élément A est plus petit que l'élément B. Dans la liste triée , l'élément A être situé à un indice inférieur à l'élément B?

enter image description here

37
AlikElzin-kilaka

L'ordre de tri est toujours croissant , où le comparateur définit quels éléments sont plus grands que les autres.

À partir de la documentation de Collections.sort (Liste <T> liste, Comparateur <? Super T> c) :

Trie la liste spécifiée selon l'ordre induit par le comparateur spécifié.

Dans la documentation de Comparator.compare (T, T) :

Compare ses deux arguments en faveur de l'ordre. Renvoie un entier négatif, zéro ou un entier positif car le premier argument est inférieur, égal ou supérieur au second.

32
Andy Thomas

C'est vous (ou plutôt votre comparateur) qui décide.

  • Si la compare(T o1, T o2) de votre Comparator renvoie un négatif lorsque o1 est inférieur à o2, vous obtenez un ordre croissant ( démo sur ideone ).
  • Si la fonction compare(T o1, T o2) de votre Comparator renvoie un négatif lorsque o1 est supérieur à o2, vous obtenez un ordre décroissant ( démo sur ideone ).

Une autre façon de dire la même chose serait que sort suppose que le comparateur ordonne que les deux éléments qui y sont passés passent de plus petit (o1) à plus grand (o2), et produisent un ordre croissant trier conformément à cette commande.

20
dasblinkenlight

La documentation de la méthode Comparator.compareTo(o1, o2) indique

Compare ses deux arguments en faveur de l'ordre. Renvoie un entier négatif, zéro ou un entier positif car le premier argument est inférieur, égal ou supérieur au second.

Donc, si vous voulez trier par ordre naturel, petit à grand, vous devez écrire l'implémentation telle que définie dans la documentation

public int compareTo(Integer o1, Integer o2) {
     int v1 = (o1);
     int v2 = (o2);
     if(v1 == v2) {
        return 0;
     }
     if(v1 < v2) {
        return -1; //return negative integer if first argument is less than second
     }
     return 1;
}

Si vous voulez que le tri soit dans l'ordre inverse, c'est petit à grand

public int compareTo(Integer o1, Integer o2) {
     int v1 = (o1);
     int v2 = (o2);
     if(v1 == v2) {
        return 0;
     }
     if(v1 < v2) {
        return 1;  //do the other way
     }
     return -1;
}
3
sanbhat

Selon la documentation https://docs.Oracle.com/javase/7/docs/api/Java/util/Collections.html#sort (Java.util.List,% 20Java.util.Comparator =, l'implémentation de tri pour Collections.sort (liste, comparateur) est mergeSort.

Étant donné que le résultat produit par mergeSort est croissant ( https://en.wikipedia.org/wiki/Merge_sort ), l'ordre de tri de Collections.sort (liste, comparateur) est croissant.

C'est-à-dire que si le comparateur décide que l'élément A est plus petit que l'élément B. Dans la liste triée, l'élément A sera situé à un indice plus petit que l'élément B.

0
Ethan