不用 If 将越界索引转化为标准索引

若一个列表是循环的,当需要将当前索引左右切换至上一个/下一个时。就需要做这样的转换。

虽然当索引越界时,可以用 if ,但有些丑,用一个算式即可。

(#list 代表列表长度,列表索引从1开始)

1、左切至前一个(将 x - 1 转到标准值):

y = ((x - 1) + (#list - 1)) % #list + 1

如,1,2,3,4,5,6,7 减一后 变为 7,1,2,3,4,5,6

2、右切至下一个(将 x + 1 转到标准值)

y = ((x + 1) + (#list - 1)) % #list + 1

如,1,2,3,4,5,6,7 加一后 变为 2,3,4,5,6,7,1

----------------------------------------------------------------------

另一个实例:

在程序中,星期日是每周的第一天,如 lua 日期函数

local date = os.date("!*t", timestamp)
print(date.wday) --1表示周天(范围1~7)

当需要将程序中的星期X转为现实意义的星期X时,

2,3,4,5,6,7,1=>1,2,3,4,5,6,7

其实就是上面的 左切至前一个 的算法。

----------------------------------------------------------------------

进一步思考:

上面的公式,x是任意值时不能处理,因为+1或-1不会超过 #list。

参考将任意角度(包括负数)转化至标准 [0, 360) 的算法:

y = (x % 360 + 360) % 360

要将任意越界数组索引(包括负数)转至标准索引的公式其实就是:

y = (x % #list + #list) % #list

只是lua的索引是从1开始的,所以就变成了:

y = (x % #list + #list - 1) % #list + 1

猜你喜欢

转载自blog.csdn.net/NRatel/article/details/123147780