2015-06-28 13 views
5

Lavorando su un elenco ordinato sono arrivato a un punto in cui avevo bisogno di implementare una funzione compareTo() per valori primitivi lunghi.Confronto effettivo() per il primitivo lungo

Io sono non sto cercando l'evidente implementazione ingenua, ma mi chiedevo se c'è un elegante codice one-liner per farlo (senza creare un nuovo Long (valore)).

Forse qualcosa di simile:

@Override public int compareTo(MyClass that) { 
    return (int) ((value - that.value) >>> 32); 
} 

Qualcuno può verificare che avrebbe funzionato e/o suggerire un'altra implementazione?

risposta

10

Un codice di linea a quello:

int res = Long.compare(long x, long y) 

Il codice non funzionerà correttamente per tutti i valori, provare per Integer.MIN_VALUE - Integer.MAX_VALUE e si otterrà uno

+0

Questa è fondamentalmente l'implementazione ingenua che si traduce in '(x traveh

+1

@traveh direi correttezza rispetto alle prestazioni. Inoltre, il metodo potrebbe già essere ottimizzato dal JDK. –

+0

@ E_net4 Sono d'accordo in generale, ma a fini argomentativi, supponiamo che si tratti di un caso speciale in cui le prestazioni sono cruciali. – traveh

1

l'algoritmo non è corretta , in quanto restituisce 0 quando viene chiesto di confrontare 1 e 0:

(1 - 0) >>> 32 
1 >>> 32 
0 

In generale, io non sono sicuro che è possibile confrontare anela senza istruzioni di salto, perché la differenza di due i lunghi potrebbero non adattarsi a lungo senza traboccare, il che cambierebbe il segno della differenza.

Sono quindi d'accordo con la risposta di Evgeniy che l'utilizzo dell'implementazione JDK è probabilmente l'approccio migliore.

Problemi correlati