2016-01-31 15 views
16

Podczas kodowania znajdę się robi to bardzo często następuje:całkowitą Java cykliczny iteracja skrótowym

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

Czy mimo to zrobić w jednej linii?

W tym przykładzie rogu powinno być 0, 1, 2, 3, 0, 1, 2, 3, 0 ....

+2

można znaleźć [modułowy arytmetyka] (https://en.wikipedia.org/wiki/Modular_arithmetic), aby być pomocnym w przyszłości. –

+0

jeśli robisz coś bardzo często, powinieneś rozważyć wyodrębnienie metody zamiast skracać kod (co jest często mniej czytelne). – Lovis

Odpowiedz

8

Zastosowanie pozostałość. To dwie linie, ale czyste.

corner++; 
corner %= 4; 
+1

Co jest bardziej wydajnego mod czy też? Szczerze mówiąc, jestem tylko ciekawostką w tym momencie. – TheJohnMajor01

+9

@ TheJohnMajor01: Przepraszam, ale to czysta przedwczesna optymalizacja. Obie są trywialnie krótkie. –

+5

O wiele ważniejsze jest to, co jest łatwiejsze do zrozumienia i debugowania 5 miesięcy później. –

4

Można to zrobić:

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

To daje możliwość przypisania coś innego do zmiennej corner W przypadku, gdy badanie corner == 4 nie przejdzie.

+0

Chociaż należy wspomnieć o argumentowaniu przeciwko dążeniu do takiej zwięzłości, ponieważ prawdopodobnie utrudni to zrozumienie kodu na pierwszy rzut oka, co utrudni przyszłym koderom, którzy muszą zachować kod. –

+3

@HovercraftFullOfEels Jeśli masz rację, OP szuka zwięzłości, a nie jasności; i dostanie to, o co prosił. –

+2

'róg = (róg + 1)% 4'. Uważam, że jest to łatwiejsze do odczytania. – Tunaki

31

Można użyć tej krótkiej i rodzaj czytelnej linii (Demo):

corner = (corner + 1) % 4; 

Lub nawet odrobinę krótszy (Demo):

corner = ++corner % 4; 
+0

róg = ++ róg% 4 –

3

używam:

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

Zignorowałem to, ponieważ używanie '++' jest zbyt mylące. Trudno utrzymać porządek operacji prosto w mojej głowie, kiedy go czytam i łatwo jest przeoczyć, że stwierdzenie "jeśli" zawiera efekty uboczne. – jpmc26

+2

@ jpmc26 Mogłem zrozumieć, czy był to "kąt ++". Ale jest to '++ corner', więc kolejność operacji jest całkowicie prosta od lewej do prawej. – emlai

1

To nie jest tak oczywiste ale muc h szybsza, ponieważ podział generalnie wykonuje wolniej niż jakakolwiek operacja bitowa.

corner = ++corner & 3; 

EDIT: I niespodziewanie odkryłem jeszcze jeden niesamowity sposób, aby jazda na rowerze - za pomocą przesunięcia i biegnie jeszcze szybciej!

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

I ta sztuczka działa tylko dla dowolnej potęgi 2.

This benchmark pokazuje wszystkie wyniki (choć to javascript, nie Java)