Language agnostic 计算数组中的上一个和下一个索引

Language agnostic 计算数组中的上一个和下一个索引,language-agnostic,Language Agnostic,我有一个基于1的数组,包含四个项目,需要遍历它们。对于数组中给定的索引,我需要计算出下一项的索引和上一项的索引。这听起来很简单,但数组需要环绕。因此,当您位于数组的开头时,前一项将被视为最后一项。同样,如果您位于数组的末尾,则下一项将被视为第一项 我意识到这可以通过使用条件语句来解决,但我想知道是否可以使用数学方程来解决。我有一个很适合下一个项目 NextItem = Modulus(CurrentItem, 4) + 1 (模函数返回一个数除以另一个数的余数) 有人对我如何计算前一项有什么想

我有一个基于1的数组,包含四个项目,需要遍历它们。对于数组中给定的索引,我需要计算出下一项的索引和上一项的索引。这听起来很简单,但数组需要环绕。因此,当您位于数组的开头时,前一项将被视为最后一项。同样,如果您位于数组的末尾,则下一项将被视为第一项

我意识到这可以通过使用条件语句来解决,但我想知道是否可以使用数学方程来解决。我有一个很适合下一个项目

NextItem = Modulus(CurrentItem, 4) + 1
(模函数返回一个数除以另一个数的余数)


有人对我如何计算前一项有什么想法吗?

由于模运算总是在基于0的范围内工作得更好,因此可以使用
CurrentItem-1
将其转换为其中一项

然后,对于模4,加3与减1是一样的,但具有从不变负的优点(一些模运算符可能不喜欢负数)

然后再次添加1以返回到基于1的数字

这使得:

PrevItem = Modulus(CurrentItem - 1 + 3, 4) + 1
或者,简化:

PrevItem = Modulus(CurrentItem + 2, 4) + 1

有两件事需要理解,第一,
module(-1,n)=n-1
,第二,
module()
最适合基于
0
的索引。将这两种方法结合起来可以:

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

对于
NumberOfItems=4
模(-2,4)=2
,它给出了Pax的答案,如果您的系统模()不支持负数,但不那么清晰,则可能是必要的。

这可能取决于模相对于负值的属性,但在Lua中,以下功能有效:

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

在您未指定的语言中,应该是
PreviousItem=modular(CurrentItem-2,4)+1

这不是modular(CurrentItem+1,4)吗?不,NextItem的公式很好用。当CurrentItem为3时,模数(CurrentItem+1,4)失败。是的,数组是基于1的,当然,对不起。