两个表格之间的差异作为一个表格

简要说明

t1 = {1,3,5,7,9}

t2 = {1,2,3,4,5,6,7,8,9}

想要的结果:t3 = {2,4,6,8}

详细说明

我有一个场景中的对象列表,和一个不在场景中的所有对象的列表。我正在尝试编写一个简单的代码片段,使我能够向场景中添加对象,但确保它不会加载已经加载的对象。

因此我可以像这样说……

SafeAdd (2, currentOBJlist, notLoadedOBJList)

并从“notLoadedOBJList”中加载2个随机对象,但所选对象不在“currentOBJlist”中

点赞
用户183120
用户183120

未排序的数组

Lua 中的表格除了是一个数组/列表之外,还可以是一个映射/字典/集合。

要创建一个集合,只需将列表中的每个元素分配为 true;这样,您就可以通过查找键来将其用作集合。如果返回的键为 nil,则表示不存在,否则它将返回 true。

function notInScene(allObjects, objectsInScene)
  -- 将 objectsInScene 转换为集合
  -- 如果已经是集合,则可以跳过此步骤
  local set = {}
  for _, v in ipairs(objectsInScene) do
    set[v] = true
  end

  -- 填充输出
  local notPresent = { }
  for _, v in ipairs(allObjects) do
    if (set[v] == nil) then
      table.insert(notPresent, v)
    end
  end
  return notPresent
end

local t1 = {1,3,5,7,9}
local t2 = {1,2,3,4,5,6,7,8,9}
local t3 = notPresent(t2, t1)
for _, v in ipairs(t3) do print(v) end

输出

2
4
6
8

请注意,我们正在将 objectsInScene 重复作为集合;如果可能的话,应避免这样做,即在原始构建时将 objectsInScene 设置为集合。

排序过的数组

如果这两个列表都保证排序,我们可以比构建集合然后查找更好的方法--双遍历解决方案,不是很高效。

function notInScene(allObjects, objectsInScene)
  j = 1
  local notPresent = {}
  for i = 1, #allObjects do
    if (allObjects[i] == objectsInScene[j]) then
      j = j + 1
    elseif (allObjects[i] < objectsInScene[j]) then
      table.insert(notPresent, allObjects[i])
    end
    i = i + 1
  end
  return notPresent
end

这给出了相同的结果,但没有浪费额外的空间或时间;它比先前的方法更可取。

2019-08-07 06:33:30