将一个数组的第一个元素弹出。
2016-10-15 20:59:49
收藏:0
阅读:157
评论:3
我在 Lua 中有一个数组 x
。我想将 head = x [1]
和 rest =
数组的其余部分设置为 rest [1] = x [2]
,rest [2] = x [3]
等等。
我应该如何操作?
(注意:我不在意原始数组是否被改变。在 JavaScript 中,我会做 head = x.shift()
,然后 x
包含剩余的元素。)
原文链接 https://stackoverflow.com/questions/4910398
点赞
stackoverflow用户405017
你需要使用table.remove
:
local t = {1,2,3,4}
local head = table.remove(t,1)
print( head )
--> 1
print( #t )
--> 3
print( t[1] )
--> 2
正如@ daurnimator所指出的那样,这需要 Lua 运行时中数组的底层实现需付出大量的工作,需要移动所有表元素。如果你可以将数组反向表示,称数组中的最后一项为 head
,那么对 table.remove()
的一次调用将会是一次便宜的弹出操作:
local t = {4,3,2,1}
local head = table.remove(t)
print(head)
--> 1
print( #t )
--> 3
print( t[#t] )
--> 2
或者,您可以选择将元素序列表示为链表,在这种情况下,从列表头弹出一个项目也是一次便宜的操作(但是将一个项目推到末尾不是,除非您在列表中跟踪“尾巴”):
local setm,getm = setmetatable,getmetatable
local linkedlist=setm({__index={
tail = function(l) while l.rest do l=l.rest end return l end, -- N.B. O(n)!
push = function(l,v,t) t=l:tail() t.rest=setm({val=v},getm(l)) return t end,
cram = function(l,v) return setm({val=v,rest=l},getm(l)) end,
each = function(l,v)
return function() if l then v,l=l.val,l.rest return v end end
end
}},{ __call=function(lmeta,v,...)
local head,tail=setm({val=v},lmeta) tail=head
for i,v in ipairs{...} do tail=tail:push(v) end
return head
end })
local numbers = linkedlist(1,2,3,4)
for n in numbers:each() do print(n) end
--> 1
--> 2
--> 3
--> 4
local head,rest = numbers.val, numbers.rest
print(head)
--> 1
for n in rest:each() do print(n) end
--> 2
--> 3
--> 4
local unrest = rest:cram('99')
for n in unrest:each() do print(n) end
--> 99
--> 2
--> 3
--> 4
特别需要注意的是:
local head,rest = numbers.val, numbers.rest
不 修改任何数据结构,只是给你一个链条中的 rest
句柄。
2011-02-06 00:12:15
stackoverflow用户6797896
通常在 Lua 中,将一个元素 x 插入到一个序列中...
比如:S={a,b,c,d,e,f} 变成 S={a,b,c,x,d,e,f}
...会非常耗时,因为需要将 d 移动到索引 5,将 e 移动到索引 6 等。
是否有另一种形式为 S 的序列,其中 S[a]=b、S[b]=c、S[c]=d、S[d]=e 和 S[e]=f? 这样,你只需要输入:
S[c]=x S[x]=d
两个操作就可以将 x 插入到 c 和 d 之间。
2018-12-01 00:14:53
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
head = table.remove(x, 1)
“弹出”有点不准确,因为它暗示了一种廉价的操作,而删除一个表的第一个元素需要重新定位其余的内容——因此在 JavaScript 和其他一些语言中称为“shift”。