2010-04-13 29 views
8

Lors de l'implémentation de compareTo(), le degré de "différence" doit-il être pris en compte? Par exemple, si j'ai 3 objets, C1, C2 et C3, tel que C1 < C2 < C3. Par exemple, si j'ai 3 objets, C1 < C2 <.Est-ce que le nombre entier spécifique signé la matière lors de la mise en œuvre compareTo dans une classe <Type> Comparable?

C1.compareTo devrait (C2) retourner un entier qui est inférieur à C2.compareTo (C3)?

La documentation de l'interface Comparable ne semble pas spécifier d'une manière ou d'une autre, donc je suppose que le degré n'a pas d'importance, mais il serait bon de savoir s'il y a un avantage à retourner un nombre spécifique (par exemple, améliorer la vitesse de tri de TreeSet ou quelque chose comme ça).

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Comparable.html#compareTo(T)

+0

1 Question intéressante – whiskeysierra

Répondre

4

Question intéressante, mais néanmoins non, l'ampleur de la int n'a aucune signification selon les spécifications Comparable<T> et Comparator<T>, seul le signe. On peut concevoir un algorithme de tri peut en outre préciser qu'ils peuvent prendre des « conseils » de l'ampleur, mais je ne suis pas sûr de savoir comment pratique qui serait pour le tri en fonction de comparaison, car nous avons vraiment besoin que de savoir si a < b, a == b ou a > b (qui est vraiment ce que Comparable et Comparator sont des abstractions OOP de).


Maintenant, il faut dire qu'il peut y avoir une intention cachée ici d'utiliser l'idiome de soustraction pour comparer les valeurs numériques, à savoir quelque chose comme ceci:

public int compare(T t1, T t2) { 
    return t1.intField - t2.intField; 
} 

Prenez note que cette méthode de comparaison potentiellement brisés, en raison de débordement possible lorsque la différence entre les deux nombres est supérieur à Integer.MAX_VALUE. En fait, c'est l'un des casse-tête couverts par Java Puzzlers.

Pour démontrer, tenez compte l'extrait suivant (tiré du livre):

int x = -2000000000; 
int z = 2000000000; 
System.out.println(x - z); // prints a positive number due to overflow 

Il est clair que x < z, et pourtant x - z est un nombre positif. Méfiez-vous d'utiliser cet idiome de soustraction: il est toujours beaucoup plus sûr de faire une comparaison explicite et return -1, 0 ou 1 à la place.

2

non, la seule différence entre les nombres négatifs, 0 et des nombres positifs. le degré est hors de propos.