lua - 两张表作为一张表的区别
问题描述
简而言之
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”中
解决方案
未排序的数组
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
这给出了相同的结果,但没有花费额外的空间或时间;它比以前的方法更可取。
推荐阅读
- r - Pandoc 2.7.3 版无法将 knitr .tex 文件转换为 .docx
- r - 关于 R 中 rpart 和 gbm 的一些问题
- apache - AH00558:httpd:无法可靠地确定服务器的完全合格
- python - 是否可以添加项目符号以绘制在 jupyter 幻灯片中呈现的输出?
- javascript - 如果我已经定义了 ID,如何将数组插入到我的 MongoDB 缝合中?
- python - 意外中断的 cProfile
- graph - 使用 cytoscape 分配节点坐标
- sql - 运行具有相互依赖关系的 sql 脚本
- javascript - 获取时如何从 API 获取编号的 ID?
- javascript - 视频标签不会在 Firefox 中自动播放,DOMException