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

时间:2008-11-24 11:27:42

标签: language-agnostic

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

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

NextItem = Modulus(CurrentItem, 4) + 1

(模数函数返回一个数字的余数除以另一个数字)。

有没有人对如何解决上一个项目有任何想法?

3 个答案:

答案 0 :(得分:2)

由于模数总是在基于0的范围上效果更好,因此您可以使用CurrentItem - 1将其转换为其中之一。

然后,使用模4,添加3与减1相同,但具有永不消极的优点(某些模运算符可能不喜欢负数)。

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

这给出了:

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

或简化:

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

答案 1 :(得分:0)

有两件事需要理解,首先是Modulus(-1,n) = n-1,其次Modulus()最适用于基于0的索引。将这两者结合起来给出了:

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

对于NumberOfItems = 4Modulus(-2,4) = 2的特定情况,它给出了Pax的答案,如果您的系统的模数()不支持负数,但可能是必要的,但不是很清楚。

答案 2 :(得分:-1)

这可能取决于你的模数的属性与负值,但在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