2016-09-26 1 views
0
class IntegerComparator implements Comparator<Integer> 
{ 
@Override 
public int compare(Integer o1, Integer o2) { 
    if(o1 < o2) 
     return 1; 
    else if(o1 > o2) 
     return -1; 
    else 
    return 0; 
} 
} 

Il donne l'ordre décroissant. Je sais cela. Je m'en souviens aveuglément. Je ne comprends pas pourquoi la mise en œuvre doit être comme ça.Implémentation de la méthode compare() dans les comparateurs créés sur mesure

Je m'attends à ce que les résultats soient dans l'ordre croissant. Parce que dans l'ordre croissant, le o1 devrait toujours être inférieur à o2 si vous prenez deux éléments adjacents. Mais il donne l'ordre décroissant auquel je ne m'attends pas.

quelqu'un peut démystifier la logique derrière

Edit:

  • Lorsque les éléments sont inversés. Est-ce quand la comparaison renvoie 1?
+2

Notez que la classe 'Integer' a une méthode statique' compare', qui fait exactement ce que vous voulez. Vous pouvez également utiliser la méthode d'instance 'compareTo'. – Berger

+0

Je connais les deux mais quelle logique définit l'ordre ascendant et l'ordre décroissant. –

+0

Btw, si vous voulez juste inverser un comparateur, depuis Java 8, ['Comparator :: reversed'] (https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html # reversed--) le fera pour vous. –

Répondre

1

Rappelez-vous que:

  • retour -1 mis t premier objet avant la seconde (généralement valeur inférieure à 0),
  • retournant 0 ne rien faire,
  • retournant 1 mettre le premier objet après le second (généralement valeur plus de 0).

Ceci est répété sur tout l'objet à comparer et vous avez un tri ascendant. Voir bubble sorting algo sur google/youtube.

Vous pouvez voir:

Collections.reverseOrder(myComparator); 

Pour obtenir un nouveau avec un ordre Comparator inverse de la vôtre.

enter image description here

Dans cette animation:

  • a> b -> retour +1 (un droit en mouvement, après b)
  • a < b -> retour -1 (un mouvement vers la gauche , avant b)
+0

Alors est-ce que 1 veut dire échanger les éléments et 0 signifie ne rien faire? –

+0

0 ne fait rien oui, d'autres valeurs permutent les objets. – Tokazio

+0

Merci Tokazio. J'ai eu ma question. –

4

Lorsque le premier argument est plus grand que l'autre, le résultat doit être un nombre positif. Lorsque le premier argument est plus petit, le résultat est un nombre négatif. Votre implémentation donne un ordre décroissant, parce que vous faites le contraire de ce que je viens d'écrire. Vous pouvez simplement multiplier cela par -1 si vous voulez une commande ascendante. Cela vient du fait que si vous soustrayez le second nombre du premier nombre et que le premier nombre est plus grand, le résultat sera positif.

1

La comparaison est basée sur la soustraction. Au niveau du processeur, c'est ce qu'il fait.

C'est une forme optimisée de.

long l = (long) o1 - o2; // use a long to avoid overflow. 
if (l < 0) return -1; 
if (l > 0) return +1; 
return 0; 

Il retourne un nombre négatif si o1 - o2 est négatif à savoir o1 < o2

Il retourne un nombre positif si o1 - o2 est positif à savoir o1> o2

et retour 0 si o1 - o2 est égal à zéro-à-dire == o2 o1

+0

Ouais. Mais qu'est-ce qui définit l'ordre ascendant et l'ordre décroissant? –

+1

@omkarsirra l'appelant (l'algorithme de tri) définit l'ordre croissant comme correspondant à la documentation, par ex. comme je viens de le décrire. Cette définition est utilisée car elle est cohérente avec la soustraction qui est ce que le CPU fait et est familier à tous ceux qui ont été à l'école primaire en faisant un bon standard à utiliser. C'est l'ordre décroissant si vous changez «o1» et «o2» car cela fait => bas et haut => haut. –