Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 作为一个表的两个表之间的差异_Lua_Set Difference - Fatal编程技术网

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

Lua 作为一个表的两个表之间的差异,lua,set-difference,Lua,Set Difference,简言之 t1={1,3,5,7,9} t2={1,2,3,4,5,6,7,8,9} 所需结果:t3={2,4,6,8} 详细解释 我有一个场景中的对象列表,还有一个不在场景中的所有对象的列表。我正在尝试编写一段简单的代码,允许我将对象添加到场景中,但确保它不会加载已加载的对象 所以我可以说 安全添加(2,currentOBJlist,notLoadedOBJList) 并将应用程序加载到“notLoadedOBJList”中的2个随机对象中,但所选对象不在“currentOBJlist”中 Lu

简言之

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

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

所需结果:t3={2,4,6,8}

详细解释

我有一个场景中的对象列表,还有一个不在场景中的所有对象的列表。我正在尝试编写一段简单的代码,允许我将对象添加到场景中,但确保它不会加载已加载的对象

所以我可以说

安全添加(2,currentOBJlist,notLoadedOBJList)

并将应用程序加载到“notLoadedOBJList”中的2个随机对象中,但所选对象不在“currentOBJlist”中 Lua中的表除了是数组/列表之外,还是一个映射/字典/表

通过将
true
分配给列表中的每个元素来进行设置;这样,您可以通过查找键将其作为一个集合使用。如果返回的键为
nil
,则该键不存在,否则将返回
true

function notInScene(allObjects, objectsInScene)
  -- build a set out of objectsInScene
  -- this step can be avoided, if it's already a set
  local set = {}
  for _, v in ipairs(objectsInScene) do
    set[v] = true
  end

  -- populate output
  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
函数notInScene(AllObject,objectsInScene)
j=1
局部不存在={}
对于i=1,#allObjects不
如果(allObjects[i]==objectsInScene[j]),则
j=j+1
elseif(allObjects[i]

这会产生相同的结果,但不会花费额外的空间或时间;与前一种方法相比,它更可取。

是否保证序列
t1
t2
都可以排序?性能是否存在问题?如果这些列表实际上是集合,请将它们创建为
{[1]=true,[3]=true,…}
。然后确定一个集合中的一个元素是否在另一个集合中需要恒定的时间。