Как я мог получить индекс массива 'пролонгировать' при увеличении? - PullRequest
4 голосов
/ 26 июля 2011

Итак, у меня есть массив с длиной 4. Когда я увеличиваю его на 1, а число становится больше, чем длина массива, я бы хотел, чтобы он переворачивался.

Например:

current_index = 3;
current_index++;
//current_index is now 0 again

current_index = 3;
current_index += 2;
//current_index would be 1

current_index = 0;
current_index--;
//current_index would be 3

В настоящее время я решаю это с помощью if-else, подобного этому

if (current_index == textviewlist.length + 1)
     current_index = 0;
else if (current_index == textviewlist.length + 2)
     current_index = 1;
else if (current_index == -1)
     current_index = 3;

Но я чувствую, что это не подходящее решение или «хороший» код.

Редактировать : Я попробовал ваше предложение, но, очевидно, java ведет себя странно с отрицательными числами.Когда я пытаюсь

current_index = (current_index - 1) % textviewlist.length;

Java берет индекс "0", уменьшает его на 1 ("-1"), а затем

 -1 % 4 = -1

Я ожидал, что он будет равен 3, см. Wolfram Alpha: -1 mod 4 Но, очевидно, оператор java% не совпадает с оператором по модулю?

Edit 2 : я нашел решение здесь: Лучший способ заставить модуль Java вести себя, как это должно быть с отрицательными числами?- Переполнение стека

Я могу просто сделать:

current_index -= 1;
current_index = (current_index % textviewlist.length + textviewlist.length)  % textviewlist.length;

Ответы [ 4 ]

8 голосов
/ 26 июля 2011

Вы можете использовать оператор по модулю.

current_index = (current_index + n) % 4;
4 голосов
/ 26 июля 2011

Вы можете использовать мод следующим образом:

current_index = (current_index + i) % 4.
3 голосов
/ 26 июля 2011

Разделите увеличенный индекс по модулю длины массива:

current_index = (current_index + n) % textviewlist.length
2 голосов
/ 26 июля 2011

Просто установите его себе по модулю 4 - или, точнее, по длине списка - после каждого приращения.

current_index += 2;
current_index %= textviewlist.length;

или вместе:

current_index = (current_index + 2) % textviewlist.length;

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

current_index += n;
while (current_index >= textviewlist.length) {
    current_index -= textviewlist.length;
}

хотя я бы удивился, если бы это не было медленнее, чем операция по модулю, тем более что длина вашего списка равна степени 2.

В любом случае, это может бытьхорошая идея заключить все это в increment() функцию:

int increment(int old_index, int n) {
    return (old_index + n) % textviewlist.length;
}

РЕДАКТИРОВАТЬ: ах, я не осознавал, что вы работаете в Java.(Я думаю, что оператор C по модулю имитирует математическое определение отрицательных чисел) Небольшое улучшение найденного вами решения будет

int increment(int old_index, int n) {
    return (old_index + n + textviewlist.length) % textviewlist.length;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...