有一个这样的清单:
people[i][j]
其中 i 和 j 都从0缩放为 n 。
每个条目如下:
people[1][1] = {genome = 0x000000, immune = 0, healing = 0}
现在,我正在遍历各个人并检查每个邻居,如:
if people[i][j+1] then ....
if people[i][j-1] then ....
if people[i+1][j] then ....
if people[i-1][j] then ....
但那些站在阵列边界的人,在一个或两个方向上没有邻居,这是我的问题。
尝试索引字段'?' (零值)
我知道为什么这个错误即将来临,但我现在已经知道如何在我的场景中解决这个问题。
(顺便说一句:我正在尝试解决这个难题,也许这些信息可以帮助您理解我的情景 因为我必须检查邻居。 https://codegolf.stackexchange.com/questions/38446/be-an-epidemiologist)
有 n * 4 - 4个条目,只有3个和4个条目,只有2个邻居。我可以将它们存储在一个额外的列表中,我可以使用其他的checkprocedure,但我认为这将是一个非常糟糕的解决方案。 此外,应有的表现在这里是个大问题。 (假设 n 为1000,每次抽奖必须完成4次检查1000次,多次抽签。
答案 0 :(得分:3)
有几种方法可以解决这个问题,这里有两种方法:
if people[i+1] and people[i+1][j] then
或
if (people[i+1] or {})[j] then
你也可以明确地测试你是否在边境,但这很容易出错:
if j < n and people[i][j+1] then ....
if j > 0 and people[i][j-1] then ....
if i < n and people[i+1][j] then ....
if i > 0 and people[i-1][j] then ....
请注意,您显示的代码实际上只有第一个维度(i
索引)的问题,因此只有这样做才有效:
if people[i][j+1] then ....
if people[i][j-1] then ....
if i < n and people[i+1][j] then ....
if i > 0 and people[i-1][j] then ....
另一个解决方案是在运行循环之前向people
添加两个空数组:
people[-1] = {}
people[n+1] = {}
答案 1 :(得分:1)
使用模数运算符。
如果索引是从 0
到 n - 1
,您可以使用:(x + 1) % n
和(x - 1 + n) % n
分别找到下一个和前一个邻居。相反,如果索引来自 1
而不是 0
(到 n
),将一个( 1
)添加到上述两个值中。
if people[i][(j + 1) % n] then ....
if people[i][(j - 1 + n) % n] then ....
if people[(i + 1) % n][j] then ....
if people[(i - 1 + n) % n][j] then ....
请注意,限制在这里发挥了重要作用。