2011-09-01 23 views
5

Sto implementando l'interfaccia Comparable in una classe banale che include un singolo membro int.Esiste una libreria per confrontare i valori del tipo primitivo?

posso realizzare in questo modo:

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

Ma questo (forse) crea 2 oggetti Integer totalmente inutili.

Oppure posso andare vero approccio cut-and-paste provato e dalla classe Integer:

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

Questo è abbastanza efficiente, ma il codice duplicati inutili.

Esiste una libreria che implementa questo metodo mancante Integer (e Double and Float)?

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

Potresti copiare l'intero 'compareTo()' in un nuovo metodo che prende due argomenti invece di usare 'this'? – BenCole

risposta

6

In Java 7, static int compare per i tipi primitivi sono stati aggiunti a tutte le classi wrapper oggetto primitivo, cioè v'è ora:

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

Forse, mi manca qualcosa, ma IMHO questa è una domanda strana.

C'è una biblioteca che implementare questo manca Integer (e doppio e Float) metodo?

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

Beh, penso che questo fa il lavoro:

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

generalmente, il codice è solo 'return v1 - v2;' – barjak

+2

@barjak: No, per favore controlla http://stackoverflow.com/questions/7273091/is-there-a-library-to-compare-primitive-type- valori/7273222 # 7273222 e commenti. –

6
  • Per int, scrivere il proprio metodo di compare (che richiede al massimo tre righe di codice ).
  • Per double, utilizzare Double.compare (da non confondere con compareTo).
  • Per float, utilizzare Float.compare.

Gli ultimi due prendono tipi primitivi e quindi evitano il pugilato e l'unboxing. Riesco a vedere un argomento per Integer che fornisce un metodo simile compare, ma per il resto non lo è.

+1

'Integer' ha anche un' compare' –

+0

@Steve Kuo: Link a Javadoc per favore? – NPE

+0

Sei corretto. Stavo pensando a 'compareTo', nel qual caso poteva fare' Integer.valueOf (i1) .compareTo (i2) '. –

-1

Questa soluzione è semplice, ma forse semplicistica:

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

Nota: @aix è corretto! Questo approccio non funzionerà con numeri interi arbitrari. Essa opererà per gli interi sempre positivi, però, ad esempio auto generato chiavi di database, ecc

+6

E riguardo l'overflow dei numeri interi? – NPE

+1

@Martijn Courteaux, non sei corretto, 'compare' e' compareTo' specificano valori negativi, 0, positivi. Non dettare -1, 0 1. Qualsiasi codice che verifica la presenza di -1 è un codice errato e non funzionante. Vedi http://download.oracle.com/javase/6/docs/api/java/lang/Comparable.html#compareTo%28T%29 –

+1

No, Javadoc dice "negativo, zero o positivo", sia per Comparable che per Numero intero. – barjak

Problemi correlati