2011-09-01 13 views
5

Estoy implementando la interfaz Comparable en una clase trivial que envuelve a un solo miembro int.¿Hay una biblioteca para comparar valores de tipo primitivo?

que pueden poner en práctica esta manera:

@Override 
    public int compareTo (final MyType o) 
    { 
     return 
      Integer.valueOf(this.intVal).compareTo(
       Integer.valueOf(o.intVal) 
      ); 
    } 

Pero esto (tal vez) crea 2 objetos Integer totalmente innecesarios.

O puedo ir probado y verdadero método de cortar y pegar desde la clase Entero:

@Override 
    public int compareTo (final MyType o) 
    { 
     int thisVal = this.intValue; 
     int anotherVal = o.intValue; 
     return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1)); 
    } 

Esto es bastante eficiente, pero el código duplicados innecesarios.

¿Hay alguna biblioteca que implemente este método Integer (y doblar y flotar) faltante?

public static int compare (int v1, int v2); 
+1

¿Podría copiar el entero 'compareTo()' a un nuevo método que toma dos argumentos en lugar de usar 'this'? – BenCole

Respuesta

6

En Java 7, static int compare para los tipos primitivos se han añadido a todas las clases de contenedor de objetos primitivos, es decir, hay ahora:

java.lang.Integer: static int compare(int x, int y); 
java.lang.Byte: static int compare(byte x, byte y); 
java.lang.Short: static int compare(short x, short y); 
etc... 
2

Tal vez, me falta algo, pero en mi humilde opinión, esta es una pregunta extraña.

¿Hay una biblioteca que implementaría esta falta Integer (y doble y flotar) método?

public static int compare (int v1, int v2); 

Bueno, creo que esto hace el trabajo:

public static int compare (int v1, int v2) 
{ 
    if (v1 < v2) return -1; 
    if (v1 > v2) return 1; 
    return 0; 
} 
+1

generalmente, el código es simplemente 'return v1 - v2;' – barjak

+2

@barjak: No, compruebe http://stackoverflow.com/questions/7273091/is-there-a-library-to-compare-primitive-type- values ​​/ 7273222 # 7273222 y comentarios. –

6
  • Para int, escribe su propio método compare (se requiere como máximo tres líneas de código ).
  • Para double, use Double.compare (no debe confundirse con compareTo).
  • Para float, use Float.compare.

Los dos últimos toman tipos primitivos y evitan así el boxeo y el desempaquetado. Puedo ver un argumento para Integer que proporciona un método similar compare, pero tal como están las cosas no.

+1

'Integer' también tiene una' comparación' –

+0

@Steve Kuo: Enlace a Javadoc por favor? – NPE

+0

Tiene razón. Estaba pensando en 'compareTo', en cuyo caso podría hacer' Integer.valueOf (i1) .compareTo (i2) '. –

-1

Esta solución es sencilla, pero quizás simplista:

public static int compare (int v1, int v2) 
{ 
    return v1 - v2; 
} 

Nota: @aix es correcta! Este enfoque no funcionará para enteros arbitrarios. Se trabajará para enteros siempre positivos, aunque, por ejemplo, automóviles generada claves de bases de datos, etc.

+6

¿Qué tal el desbordamiento de enteros? – NPE

+1

@Martijn Courteaux, es incorrecto, 'compare' y' compareTo' especifican valores negativos 0, positivos. No dicta -1, 0 1. Cualquier código que verifique -1 es malo y código roto. Consulte http://download.oracle.com/javase/6/docs/api/java/lang/Comparable.html#compareTo%28T%29 –

+1

No, el Javadoc dice "negativo, cero o positivo", tanto para Comparable como Entero. – barjak

Cuestiones relacionadas