Разработка предыдущего и следующего индекса в массиве - PullRequest
0 голосов
/ 24 ноября 2008

У меня есть массив из четырех элементов на основе 1, который мне нужно пройти. Для заданного индекса в массиве мне нужно определить индекс следующего элемента и индекс предыдущего элемента. Это звучит просто, но массив нужно обернуть вокруг. Поэтому, когда вы находитесь в начале массива, предыдущий элемент считается последним элементом. Аналогично, если вы находитесь в конце массива, следующим элементом считается первый элемент.

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

NextItem = Modulus(CurrentItem, 4) + 1

(функция модуля возвращает остаток от одного числа, деленного на другое).

У кого-нибудь есть идеи относительно того, как я могу обработать предыдущий элемент?

Ответы [ 3 ]

2 голосов
/ 24 ноября 2008

Так как модуль всегда лучше работает на диапазонах от 0, вы можете превратить его в один из них, используя CurrentItem - 1.

Затем, по модулю 4, добавление 3 - это то же самое, что вычитание 1, но преимущество в том, что он никогда не становится отрицательным (некоторые операторы по модулю могут не любить отрицания).

Затем вы снова добавляете 1, чтобы вернуться к основанному на 1 номеру.

Это дает:

PrevItem = Modulus(CurrentItem - 1 + 3, 4) + 1

или, упрощенно:

PrevItem = Modulus(CurrentItem + 2, 4) + 1
0 голосов
/ 24 ноября 2008

Это может зависеть от свойств вашего модуля от отрицательных значений, но в Lua работает следующее:

for i = 1, 8 do
  local idxF = i % 4 + 1
  local idxB = (i - 2) % 4 + 1
  print(i .. " " .. idxF .. " " .. idxB)
end

Должно быть PreviousItem = Modulus(CurrentItem - 2, 4) + 1 на вашем неуказанном языке.

0 голосов
/ 24 ноября 2008

Необходимо понять две вещи, во-первых, Modulus(-1,n) = n-1, а во-вторых, Modulus() лучше всего будет работать с индексированием на основе 0. Объединение этих двух дает:

NextItem = Modulus((CurrentItem-1)+1, NumberOfItems) + 1
PrevItem = Modulus((CurrentItem-1)-1, NumberOfItems) + 1

Для конкретного случая NumberOfItems = 4, Modulus(-2,4) = 2, который дает ответ Пакса и может быть необходим, если модуль вашей системы () не поддерживает отрицательные числа, но не так ясен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...