2016-01-31 3 views
16

При кодировании я считаю себя делать очень часто следующие:Java целое циклическая итерация обсчитывать

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

Есть в любом случае сделать это в одной строке?

В этом примере угол должен быть 0, 1, 2, 3, 0, 1, 2, 3, 0 ....

+2

Вы можете найти [модульная арифметика] (https://en.wikipedia.org/wiki/Modular_arithmetic), чтобы быть полезной в будущем. –

+0

, если вы обнаружите, что занимаетесь чем-то очень часто, вам следует рассмотреть вопрос об извлечении метода, а не о сокращении кода (что часто менее читаемо). – Lovis

ответ

8

использование остатка. Это две линии, но чистые.

corner++; 
corner %= 4; 
+1

Что более эффективно для мод или если? Честно говоря, я просто любопытный. – TheJohnMajor01

+9

@ TheJohnMajor01: извините, но это чистая преждевременная оптимизация. Оба они тривиально кратки. –

+5

Гораздо важнее то, что легче понять и отладить через 5 месяцев. –

4

Вы можете сделать это:

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

Это даст вам возможность присвоить что-то еще к переменной corner в случае, если ваш corner == 4 тест не прошел.

+0

Хотя верно, нужно упомянуть, чтобы возражать против стремления к такой краткости, поскольку это, вероятно, затруднит понимание кода с первого взгляда, что усложнит будущие кодеры, которые должны поддерживать код. –

+3

@HovercraftFullOfEels Хотя вы тоже правы, OP ищет краткость, а не ясность; И он получит то, что попросил. –

+2

'corner = (угол + 1)% 4'. Мне это легче читать. – Tunaki

31

Вы можете использовать эти короткие и вид читаемые линии (Demo):

corner = (corner + 1) % 4; 

Или, даже чуть-чуть короче (Demo):

corner = ++corner % 4; 
+0

corner = ++ corner% 4 –

3

Я использую:

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

Я проигнорировал это, потому что использование '++' inline слишком запутанно. Трудно держать порядок операций прямо в моей голове, когда я читаю его, и легко пропустить, что оператор 'if' содержит побочные эффекты. – jpmc26

+2

@ jpmc26 Я мог понять, был ли это 'corner ++'. Но это '++ corner', поэтому порядок операций является абсолютно простым слева направо. – emlai

1

Это не так очевидно but muc h быстрее, так как деление обычно выполняется медленнее любой побитовой операции.

corner = ++corner & 3; 

EDIT: И удивительно, я обнаружил еще один удивительный способ сделать езду на велосипеде - используя сдвиги, и он работает еще быстрее!

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

И этот трюк работает только для любой степени 2.

This benchmark показывает все результаты (хотя это JavaScript, а не Java)