2013-08-29 4 views
9

Qual è il modo migliore per verificare se la variabile è più grande di un numero utilizzando l'istruzione switch? O ti consigli di usare if-else? Ho trovato un esempio del genere:Come utilizzare maggiore o uguale in un'istruzione switch

int i; 

if(var1>var2) i = 1; 
if(var1=var2 i = 0; 
if(var1<var2) i = -1; 

switch (i); 
{ 
    case -1: 
    do stuff; 
    break; 

    case 0: 
    do stuff; 
    break; 

    case 1: 
    do stuff; 
    break; 

} 

Cosa si può dire a un novizio dell'uso di "maggiore o uguale" nelle istruzioni switch?

+5

Direi che sarà più chiaro con 3 'se' – SJuan76

+0

Stai meglio con un if-else –

+2

Non riesco a capire perché useresti un'istruzione switch se hai già un'istruzione if. Basta farlo con istruzioni if ​​poiché la logica è già presente – Mattsjo

risposta

17

Non sono sicuro se questo è quello che stai chiedendo, ma si potrebbe fare in questo modo:

int var1; 
int var2; 

int signum = Long.signum((long)var1 - var2); 
switch(signum) { 
    case -1: break; 
    case 0: break; 
    case 1: break; 
} 
+2

Questo è un codice molto breve, ma non sono sicuro se questo è facilmente leggibile per tutti (incluso me stesso). Penso che sia più importante avere un codice che sia facilmente leggibile se il codice verrà mantenuto da molte persone per un lungo periodo di tempo. – treeno

+1

+1 per usare l'interruttore e ho aggiornato la mia risposta. Grazie per la segnalazione. –

+1

Non consigliato a causa del rischio di overflow numerico. Ci possono volere ore per trovare il bug. – Holger

4

Java supporta solo i valori diretti, non intervalli in case dichiarazioni, quindi, se è necessario utilizzare un interruttore, mappare prima le opzioni, quindi accedervi, come nell'esempio che fornite è la vostra unica scelta. Tuttavia questo è abbastanza eccessivo: basta usare le istruzioni if.

+0

Fondamentalmente vero. Tuttavia, in alcuni casi (non nel caso dell'OP), l'opzione predefinita può essere utilizzata per supportare in modo efficace un intervallo. – emory

10

Consiglio vivamente un costrutto if(var1>var2){}else if (var1==var2) {} else {}. L'uso di un interruttore qui nasconderà l'intento. E se uno break viene rimosso per errore?

L'opzione è utile e chiara per i valori enumerati, non per i confronti.

6

In primo luogo un suggerimento: switch come afferma dovrebbe essere utilizzato solo per la commutazione e non per il controllo delle condizioni.

From JLS switch statements

SwitchStatement: 
    switch (Expression) SwitchBlock 

Espressioni convertibili a int o Enum sono supportati nell'espressione.

Queste etichette sono detti essere associato con l'istruzione switch, come sono i valori delle espressioni costanti (§15.28) o costanti enum (§8.9.1) nelle etichette dei casi.

Sono supportate solo le espressioni costanti e le costanti Enum nelle istruzioni switch per 1.6 o precedenti con i valori di stringa java 7. Nessuna espressione logica è supportata.

In alternativa si può fare come indicato da @Stewart nella sua risposta.

+0

Se 'var1 == 6' e' var2 == 4', allora 'var1 - var2 == 2' che non è nel tuo' switch'. Devi usare 'Integer.signum()' come da mia risposta 5 minuti fa. :) – Stewart

+0

E con il signum è ancora rotto in quanto la differenza può essere superiore all'intervallo intero che si traduce in un trabocco e risultati errati. – Holger

0

Se si utilizza il valore di una variabile , utilizzare il parametro. Se sono in gioco le variabili multiple, utilizzare if. Nel tuo problema dichiarato, dovrebbe essere se.

3

Un'istruzione switch è per il codice in esecuzione quando vengono restituiti valori specifici, il se in caso contrario consente di selezionare un intervallo di valori in un'istruzione. Suggerirei di fare qualcosa di simile a quanto segue (anche se io personalmente preferisco il metodo Integer.signum) si dovrebbe voler guardare più intervalli:

int i; 

if (var1 > var2) { 
    i = 1; 
} 
else if (var1 == var2) { 
    i = 0; 
} 
else { 
    i = -1; 
} 
0

Purtroppo si può fare questo in Java. È possibile in CoffeeScript o in altre lingue.

Si consiglia di utilizzare uno-if - else -statement spostando il "fare cose" in altri metodi.In questo modo puoi mantenere il tuo if-else in un codice chiaramente leggibile.

2

Stai meglio con le dichiarazioni if; l'approccio switch è molto meno chiaro, e in questo caso, l'approccio è oggettivamente errato. The contract for Comparable#compareTo non richiede il ritorno -1 o 1, solo che il valore del reso int è negativo o positivo. È assolutamente legittimo per compareTo restituire -42 e l'istruzione switch rilascia il risultato.