2010-04-13 11 views
8

Al implementar compareTo(), ¿se debe tener en cuenta el grado de "diferencia"?¿Importa el entero con signo específico al implementar compareTo en una clase Comparable <Type>?

Por ejemplo, si tengo 3 objetos, C1, C2 y C3, de modo que C1 < C2 < C3.

¿Debería C1.compareTo (C2) devolver un número entero menor que C2.compareTo (C3)?

La documentación para la interfaz Comparable no parece especificar de una manera u otra, así que supongo que el grado no importa, pero sería bueno saber si hay alguna ventaja en devolver un número específico (por ejemplo, mejorar la velocidad de ordenación TreeSet o algo así).

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

+0

+1 pregunta interesante – whiskeysierra

Respuesta

4

Pregunta interesante, pero no obstante, la magnitud de int no tiene importancia según las especificaciones Comparable<T> y Comparator<T>, solo el signo. Es concebible que algunos algoritmos de clasificación puedan especificar que pueden tomar "pistas" de la magnitud, pero no estoy seguro de qué tan práctico sería para la clasificación basada en la comparación, ya que solo necesitamos saber si a < b, a == b, o a > b (que es realmente lo que Comparable y Comparator son abstracciones OOP de).


ahora tiene que ser dicho que puede haber una intención oculta aquí de utilizar el lenguaje de resta para comparar valores numéricos, es decir algo como esto:

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

Ten en cuenta que este método de comparación es potencialmente roto, debido a un posible desbordamiento cuando la diferencia entre los dos números es mayor que Integer.MAX_VALUE. De hecho, este es uno de los acertijos cubiertos en Java Puzzlers.

Para demostrarlo, consideremos el siguiente fragmento (tomado del libro):

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

Claramente x < z, y sin embargo x - z es un número positivo. Tenga cuidado con el uso de este modismo de resta: siempre es mucho más seguro hacer una comparación explícita y return -1, 0, o 1 en su lugar.

2

no, la única diferencia es entre los números negativos, 0, y los números positivos. el grado es irrelevante.

Cuestiones relacionadas