2016-01-31 16 views
16

Quando si codifica mi ritrovo nel seguente modo molto spesso:Java integer iterazione ciclica Stenografia

corner++; 
if(corner == 4) corner = 0; 

C'è comunque farlo in una linea?

In questo esempio angolo dovrebbe essere 0, 1, 2, 3, 0, 1, 2, 3, 0 ....

+2

Si possono trovare [aritmetica modulare] (https://en.wikipedia.org/wiki/Modular_arithmetic) per essere utile in futuro. –

+0

se ti ritrovi a fare qualcosa molto spesso, dovresti prendere in considerazione l'estrazione di un metodo piuttosto che rendere il codice più corto (che è spesso meno leggibile) – Lovis

risposta

8

Uso resto. Sono due linee ma pulite.

corner++; 
corner %= 4; 
+1

Che cos'è la mod più efficiente o se? Ad essere onesti, sono solo curioso a questo punto. – TheJohnMajor01

+9

@ TheJohnMajor01: scusa ma è pura ottimizzazione prematura. Entrambi sono banalmente brevi. –

+5

Molto più importante è ciò che è più facile da comprendere e eseguire il debug dopo 5 mesi. –

4

Si può fare questo:

corner = ++corner == 4 ? 0 : corner; 

Questo darebbe la possibilità di assegnare un'altra cosa alla variabile corner nel caso in cui il test corner == 4 non ha superato.

+0

Mentre è vero, bisogna menzionare la lotta contro la ricerca di una tale brevità che probabilmente renderà più difficile comprendere a colpo d'occhio il codice, rendendo più difficile per i futuri programmatori che devono mantenere il codice. –

+3

@HovercraftFullOfEels Anche se hai ragione, l'OP cerca la brevità, non la chiarezza; e otterrà ciò che ha chiesto. –

+2

'corner = (angolo + 1)% 4'. Trovo questo più facile da leggere. – Tunaki

31

È possibile utilizzare questa linea breve e tipo di leggibile (Demo):

corner = (corner + 1) % 4; 

O, ancora un po 'piccolo più breve (Demo):

corner = ++corner % 4; 
+0

corner = ++ corner% 4 –

3

io uso:

if (++corner == 4) corner = 0; 
+2

Ho downvoted questo perché usare '++' inline è troppo confuso. È difficile mantenere l'ordine delle operazioni nella mia testa quando lo leggo, ed è facile perdere che l'istruzione 'if' contenga effetti collaterali. – jpmc26

+2

@ jpmc26 Capisco se fosse 'corner ++'. Ma è '++ corner' quindi l'ordine delle operazioni è completamente sinistro-a-destra. – emlai

1

Non è così ovvio ma muc h più veloce, poiché la divisione generalmente viene eseguita più lentamente di qualsiasi operazione bit a bit.

corner = ++corner & 3; 

EDIT: E sorprendentemente ho scoperto un altro modo impressionante per rendere il ciclismo - utilizzando turni, e funziona ancora più veloce!

corner = ++corner <<30>>> 30; 

E questo trucco funziona solo per qualsiasi potenza di 2.

This benchmark mostra tutti i risultati (anche se è javascript, non java)