如何检查 Lua table 是否包含坐标?
How to check if Lua table contains coordinates?
我正在尝试实现一个适用于开放列表和封闭列表的简单寻路系统。我在关闭列表时遇到问题。如何检查关闭列表是否已经包含坐标?
closed[current] = true
local neighbors = getNeighbors(current[1], current[2]) -- get neighbors for the current node
for k, v in ipairs(neighbors) do -- iterate through each neighbor
if not closed[v] then
table.insert(open, v)
end
end
getNeighbours returns 瓦片 (x,y) 的每个相邻瓦片以坐标 (x,y) 的形式。如何检查关闭的 table 是否已包含这些坐标?
哈希整个 table
使用Lua,table的键(散列)几乎可以是任何东西,EVEN一个table有2个值。
假设current[1]
和current[2]
分别代表坐标x
和y
,你可以只检查closed[current]
。请参阅以下示例:
local coordinates = {
{1.3,5},
{2.2,3.4},
{3,6.8}
}
local closed = {} --Empty closed list
local current = coordinates[1] --{1.3,5}
print(closed[current]) --Not visited = nil
closed[current] = true --Marking as visited
print(closed[current]) --visited = true
print(coordinates[2]) --Not visited = nil
勾选if closed[current] then ...
时,不存在的条目等同于nil
,即等同于false
。如果你明确想要 false
值而不是 nil
你可以像这样初始化关闭列表:
closed = {}
for i=1,#coordinates do
closed[coordinates[i]] = false
end
散列坐标值
如果您在代码中的某处复制坐标值而不是引用 table {x,y}
,则会出现唯一的问题。在那种情况下,你会有不同的 tables,所以哈希会给你 false
即使 2 tables 的值相等。
如果这很可能发生,您将需要使用 VALUES 而不是 table 进行散列。您可以按照 Egor 建议的方式执行此操作,使用单个散列,使用双散列,如下所示:
local function listAddPoint(list,point) --Adds point (a {x,y} table) to the list
if not list[point[1]] then
list[point[1]] = {}
end
list[point[1]][point[2]] = true
end
local function listHasPoint(list,point) --Checks if the point (a {x,y} table) is on the list
if list[point[1]] and list[point[1]][point[2]] then
return true
end
return false
end
local coordinates = {
{1.3,5},
{2.2,3.4},
{3,6.8}
}
local closed = {} --Empty closed list
local current = coordinates[1] --{1.3,5}
print(listHasPoint(closed,current)) --Not visited = false
listAddPoint(closed,current)--Marking as visited
print(listHasPoint(closed,current)) --visited = true
print(listHasPoint(closed,coordinates[2])) --Not visited = false
我正在尝试实现一个适用于开放列表和封闭列表的简单寻路系统。我在关闭列表时遇到问题。如何检查关闭列表是否已经包含坐标?
closed[current] = true
local neighbors = getNeighbors(current[1], current[2]) -- get neighbors for the current node
for k, v in ipairs(neighbors) do -- iterate through each neighbor
if not closed[v] then
table.insert(open, v)
end
end
getNeighbours returns 瓦片 (x,y) 的每个相邻瓦片以坐标 (x,y) 的形式。如何检查关闭的 table 是否已包含这些坐标?
哈希整个 table
使用Lua,table的键(散列)几乎可以是任何东西,EVEN一个table有2个值。
假设current[1]
和current[2]
分别代表坐标x
和y
,你可以只检查closed[current]
。请参阅以下示例:
local coordinates = {
{1.3,5},
{2.2,3.4},
{3,6.8}
}
local closed = {} --Empty closed list
local current = coordinates[1] --{1.3,5}
print(closed[current]) --Not visited = nil
closed[current] = true --Marking as visited
print(closed[current]) --visited = true
print(coordinates[2]) --Not visited = nil
勾选if closed[current] then ...
时,不存在的条目等同于nil
,即等同于false
。如果你明确想要 false
值而不是 nil
你可以像这样初始化关闭列表:
closed = {}
for i=1,#coordinates do
closed[coordinates[i]] = false
end
散列坐标值
如果您在代码中的某处复制坐标值而不是引用 table {x,y}
,则会出现唯一的问题。在那种情况下,你会有不同的 tables,所以哈希会给你 false
即使 2 tables 的值相等。
如果这很可能发生,您将需要使用 VALUES 而不是 table 进行散列。您可以按照 Egor 建议的方式执行此操作,使用单个散列,使用双散列,如下所示:
local function listAddPoint(list,point) --Adds point (a {x,y} table) to the list
if not list[point[1]] then
list[point[1]] = {}
end
list[point[1]][point[2]] = true
end
local function listHasPoint(list,point) --Checks if the point (a {x,y} table) is on the list
if list[point[1]] and list[point[1]][point[2]] then
return true
end
return false
end
local coordinates = {
{1.3,5},
{2.2,3.4},
{3,6.8}
}
local closed = {} --Empty closed list
local current = coordinates[1] --{1.3,5}
print(listHasPoint(closed,current)) --Not visited = false
listAddPoint(closed,current)--Marking as visited
print(listHasPoint(closed,current)) --visited = true
print(listHasPoint(closed,coordinates[2])) --Not visited = false