浅析Lua中table的遍历和删除(转)
来源:互联网 发布:java qq邮箱 编辑:程序博客网 时间:2024/06/16 01:22
- for key, value in pairs(tbtest) do
- XXX
- end
- for key, value in ipairs(tbtest) do
- XXX
- end
- for i=1, #(tbtest) do
- XXX
- end
- for i=1, table.maxn(tbtest) do
- XXX
- end
- tbtest = {
- [1] = 1,
- [2] = 2,
- [3] = 3,
- [4] = 4,
- }
- for key, value in pairs(tbtest) do
- print(value)
- end
- tbtest = {
- [1] = 1,
- [2] = 2,
- [3] = 3,
- [5] = 5,
- }
- for k,v in ipairs(tbtest) do
- print(v)
- end
- local tbtest = {
- [2] = 2,
- [3] = 3,
- [5] = 5,
- }
- for k,v in ipairs(tbtest) do
- print(v)
- end
- tbtest = {
- [1] = 1,
- [2] = 2,
- [3] = 3,
- }
- print(#(tbtest))
- tbtest = {
- [1] = 1,
- [2] = 2,
- [6] = 6,
- }
- print(#(tbtest))
- tbtest = {
- ["a"] = 1,
- [2] = 2,
- [3] = 3,
- }
- print(#(tbtest))
- tbtest = {
- [“a”] = 1,
- [“b”] = 2,
- [“c”] = 3,
- }
- print(#(tbtest))
- tbtest = {
- [1] = 1,
- [2] = 2,
- [3] = 3,
- }
- print(table.maxn(tbtest))
- tbtest = {
- [6] = 6,
- [1] = 1,
- [2] = 2,
- }
- print(table.maxn(tbtest))
- tbtest = {
- ["a"] = 1,
- [2] = 2,
- [3] = 3,
- }
- print(table.maxn(tbtest))
- tbtest = {
- [“a”] = 1,
- [“b”] = 2,
- [“c”] = 3,
- }
- print(table.maxn(tbtest))
- print(#(tbtest))
- tbtest = {
- [1] = 1,
- [2] = 2,
- [3] = 3,
- ["a"] = 4,
- ["b"] = 5,
- }
- tbtest = {
- tbaaa = {
- [1] = 1,
- [2] = 2,
- [3] = 3,
- },
- ["a"] = 4,
- ["b"] = 5,
- }
- for k, v in pairs(tbtest) do
- print(k, v)
- end
- for k, v in ipairs(tbtest) do
- print(k,v)
- end
- tbtest = {
- [1] = 1,
- [10000] = 2,
- }
- local count = 0
- for i=1, table.maxn(tbtest) do
- count = count + 1
- print(tbtest[i])
- end
- print(count)
- for k, v in pairs(tbtest) do
- for k, v in ipairs(tbtest) do
- tbtestAward = {
- [8] = 1,
- [16] = 3,
- }
- function GetAward(nSeq)
- for 遍历整个奖励表 do
- if 满足key的条件 then
- return 返回对应奖励的key
- end
- end
- return nil
- end
- for i=1, table.maxn(tbtestAward) do
- if tbtestAward[i] ~= nil then
- if nSeq <= i then
- return i
- end
- end
- end
- function pairsByKeys(t)
- local a = {}
- for n in pairs(t) do
- a[#a+1] = n
- end
- table.sort(a)
- local i = 0
- return function()
- i = i + 1
- return a[i], t[a[i]]
- end
- end
- for key, value in pairsByKeys(tbtestAward) do
- if nSeq <= key then
- return key
- end
- end
- tbtest = {
- [1] = 1,
- [2] = 2,
- [3] = 3,
- [5] = 5,
- }
- for i=1, #(tbtest) do
- print(tbtest[i])
- end
- tbtest = {
- [1] = 1,
- [2] = 2,
- [4] = 4,
- [5] = 5,
- }
- for i=1, #(tbtest) do
- print(tbtest[i])
- end
在Lua中,table如何安全的移除元素这点挺重要,因为如果不小心,会没有正确的移除,造成内存泄漏。
引子
比如有些朋友常常这么做,大家看有啥问题
将test表中的偶数移除掉local test = { 2, 3, 4, 8, 9, 100, 20, 13, 15, 7, 11}for i, v in ipairs( test ) do if v % 2 == 0 then table.remove(test, i) endendfor i, v in ipairs( test ) do print(i .. "====" .. v)end
打印结果:
1====32====83====94====205====136====157====78====11[Finished in 0.0s]
有问题吧,20怎么还在?这就是在遍历中删除导致的。
如何做呢?
Let's get started!local test = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p' }local remove = { a = true, b = true, c = true, e = true, f = true, p = true }local function dump(table) for k, v in pairs( table ) do print(k) print(v) print("*********") endend
说明:一般我们不在循环中删除,在循环中删除会造成一些错误。这是可以建立一个remove表用来标记将要删除的,如上面例子,把将要删除的标记为true
方法1 从后往前删除
for i = #test, 1, -1 do if remove[test[i]] then table.remove(test, i) endenddump(test)
为什么不从前往后,朋友们可以测试,table.remove操作后,后面的元素会往前移位,这时候后续的删除索引对应的元素已经不是之前的索引对应的元素了。
方法2 while删除
local i = 1while i <= #test do if remove[test[i]] then table.remove(test, i) else i = i + 1 endenddump(test)
方法3 quick中提供的removeItem
function table.removeItem(list, item, removeAll) local rmCount = 0 for i = 1, #list do if list[i - rmCount] == item then table.remove(list, i - rmCount) if removeAll then rmCount = rmCount + 1 else break end end endendfor k, v in pairs( remove ) do table.removeItem(test, k)end
local bulletDel = {}--存放删除子弹元素的table
local enemyDel = {}--存放删除敌机的table
for k_bullet,v_bullet in ipairs(bullet)do
local bulletPoint = cc.p(v_bullet:getPositionX(),v_bullet:getPositionY())
for k_enemy,v_enemy in ipairs(enemy)do
local enemyRect = v_enemy:getBoundingBox()
if cc.rectContainsPoint(enemyRect,bulletPoint)then
table.insert(bulletDel,k_bullet)--这里有个小技巧,把要删除的数据的表的索引放到删除表缓存中,这样在删除就很方便了
table.insert(enemyDel,k_enemy)
end
end
end
for key,valuein ipairs(bulletDel)do
bullet[value]:removeSelf()--在游戏中把子弹删除
table.remove(bullet,value)
end
for key,valuein ipairs(enemyDel)do
enemy[value]:removeSelf()
table.remove(enemy,value)
end
- 浅析Lua中table的遍历和删除(转)
- 浅析Lua中table的遍历和删除
- 浅析Lua中table的遍历和删除
- 浅析Lua中table的遍历(转)
- 【Lua】浅析Lua中table的遍历
- 【Lua】浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 浅析Lua中table的遍历
- 统计分析用户信息量的工具Flurry的使用
- Note2 N7100安装Android5.0系统
- H2数据库使用
- ubuntu udhcp, lease time test
- Object C中分类的使用
- 浅析Lua中table的遍历和删除(转)
- Android第三方移动支付解决方案即将推出
- c++构造函数和拷贝构造函数
- grub2 install xubuntu
- Shell编程应用篇之网站自动化备份
- Object C 内存管理
- JUnit4---Hamcrest匹配器常用方法总结
- Linux 批量删除指定后缀的文件
- 排序专题学习笔记——交换排序