如何检查 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]分别代表坐标xy,你可以只检查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