2011-08-02 15 views
16

Double tiene Double.compare para comparar dos primitivas dobles. ¿Por qué el Integer no tiene uno?¿Cómo es que la clase Integer de Java no tiene el método compare()?

Entiendo que es una cantidad de código trivial para escribir, pero pregunta por curiosidad.

Editar: Me doy cuenta de que tanto Integer como Double tienen compareTo. Pero el uso de compareTo requiere encapsular la primitiva int en un objeto Integer, que tiene un costo bastante alto. Además, inta> intb no es lo mismo que compare (inta, intb), ya que este último devuelve +1, 0 o -1, mientras que el primero es verdadero/falso ....

+1

[Sí]] (http://download.oracle.com/javase/6/docs/api/java/lang/Integer.html#compareTo \ (java.lang.Integer \)). – jiggy

+1

No tiene el método 'compare (int a, int b)'; sin embargo, puede usar: 'nuevo Integer (a) .compareTo (b)' – ty1824

+0

@ ty1824 que requiere encajonar la primitiva en un objeto. .. – rxin

Respuesta

17

Fue un descuido que Java 7 resolverá

http://download.oracle.com/javase/7/docs/api/java/lang/Integer.html#compare%28int,%20int%29

public static int comparar (int x, int y )

Compara dos valores int numéricamente. El valor devuelto es idéntico a lo que serían devueltos por:

Integer.valueOf(x).compareTo(Integer.valueOf(y)) 

Parámetros: x - el primer int para comparar y - la segunda int comparar Devuelve: el valor 0 si x == y; un valor menor que 0 si x < y; y un valor mayor que 0 si x> y Desde: 1.7

+1

No diría que es un descuido, más bien una omisión deliberada basada en el hecho de que es trivial para los ints y opuesto a los números de coma flotante. Probablemente hayan tenido un nuevo pensamiento para 7, ¡pero sí está incluido! – berry120

2

Los valores de punto flotante no necesariamente se comparará binariamente, debido a la imprecisión en la representación de punto flotante, por lo tanto, se requiere un operador compare() para comparar dos valores de punto flotante, esencialmente asegurándose de que la diferencia entre ellos no sea mayor que un valor de error (pequeño). Los enteros se pueden comparar de forma binaria, por lo que pueden usar el operador de igualdad.

+0

+1, pero recuerde que las operaciones de igualdad se deben hacer usando 'int', no' Integer' – ty1824

+3

Usted * puede * comparar valores de punto flotante con un simple operador '<', solo tiene que saber lo que está haciendo. Además, el método 'Double.compare' no usa esto * compare con una pequeña diferencia *" igualdad ", simplemente porque no es necesario. –

4

Comparando de esta manera es trivial, la comparación de dobles es en realidad mucho más complicada de lo que podría parecer en un principio. Tienes que lidiar con cosas como valores de error y casos menos evidentes como NaN.

Ver this question para más detalles.

De cualquier manera, a partir de Java 7, ¡también tendrás un método para ints!

+0

Puede ser trivial, pero la verdad es que siempre me olvido de cuál debería ser 1 o cuál debería ser -1. No es que me tome mucho tiempo recordarlo, pero la idea de tomar la lógica (que esto califica como) y ponerla en mil millones de lugares simplemente porque es trivial es, en mi opinión, una decisión pobre. – corsiKa

0

Probablemente porque la operación compare es relativamente simple (pero aún así muchas personas lo malinterpretan). Y en comparación con double, realmente lo es.

También me gustaría tener este método incorporado, lo que hace que otras personas escriban código más simple. Pero mientras Oracle no lo vea como un problema, tenemos que confiar en la guayaba de Google o en bibliotecas similares para proporcionar los bits que faltan.

6

El compare en Double tiene el mismo efecto que:

new Double(d1).compareTo(new Double(d2)) 

Lo que significa que se necesita NaN, +0 y -0 en cuenta (citando el documento de compareTo()):

  • doble. Se considera que NaN es igual a sí mismo y mayor que todos los demás valores dobles (incluido Double.POSITIVE_INFINITY).
  • 0.0d se considera que este método es mayor que -0.0d.

Desde entero no tiene NaN, y ambos +0 y -0 será tomado como acaba 0, tal método no es realmente necesario para la funcionalidad.

+1

Creo que esta puede ser la única respuesta que realmente proporciona la información correcta. – jjnguy

+0

Sí, no es broma. Me sorprende cuánta gente cree ciegamente que "Double.compare" se ocupa de las imprecisiones de los puntos flotantes. – StriplingWarrior

Cuestiones relacionadas