Lua 内table遍历

在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是:

1. ipairs

for index, value in ipairs(table) do

end

注:这种方式的遍历只会从key为1的地方开始,一直以key递增1的顺序来遍历,若找到一个递增不是1的key就结束遍历,无论后面是否仍然是顺序的key。

 --Sample_1:
local tab1 =
{
[] = ,
[] = ,
[] = ,
[] = ,
}
for key, value in ipairs(tab1) do
  print(value) -->1 2 3 4
end
--Sample_2:
local tab2 =
{
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
}
for key, value in ipairs(tab2) do
print(value) -->1 2 3
end
--Sample_3:
local tab3 =
{
[] = ,
[] = ,
[] = ,
}
for key, value in ipairs(tab3) do
print(value) -->没有打印
end

2. pairs

for key, value in pairs(table) do

end

这种方式的遍历是根据table中key的hash值排列的顺序来遍历,并非是table中key的排列顺序,并且不关心key是否从1开始和key是否以1递增。

--Sample_1:
local tab1 =
{
[] = ,
[] = ,
[] = ,
[] = ,
} for key, value in pairs(tab1) do
print(value) -->1 2 4 3
end
--Sample_2:
local tab2 =
{
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
}
for key, value in pairs(tab2) do
print(value) -->6 2 3 1 5
end
--Sample_3:
local tab3 =
{
[""] = ,
[""] = ,
[""] = ,
[""] = ,
[""] = ,
}
for key, value in pairs(tab3) do
print(value) -->1 3 2 5 6
end

3. #table

for i=1, #(table) do

end

注:这种方式的遍历关键的地方在于获取table的大小,#(table)只会从key为1的地方开始,一直以key递增1的顺序来遍历,若找到一个递增不是1的key就结束遍历并且返回table的大小,无论后面是否仍然是顺序的key。

--Sample_1:
local tab1 =
{
[] = ,
[] = ,
[] = ,
[] = ,
} print("#table:"..#(tab1)) -->4
for i = , #(tab1) do
print(tab1[i]) -->1 2 3 4
end --Sample_2:
local tab2 =
{
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
} print("#table:"..#(tab2)) -->3
for i = , #(tab2) do
print(tab2[i])
end
--Sample_3:
local tab3 =
{
[] = ,
[] = ,
[] = ,
} print("#table:"..#(tab3)) -->0
for i = , #(tab3) do
print(tab3[i]) -->没有打印
end

4. table.maxn(table)

  这种方式的遍历和第三种方式差不多,关键的地方是在table.maxn(table),table.maxn(table)的意思是获取table中最大值的key。 

local tab2 =
{
[] = ,
[] = ,
[] = ,
["a"] = ,
[] = ,
[] = ,
} print("table.maxn:"..table.maxn(tab2)) -->6
for i = , table.maxn(tab2) do
print(tab2[i]) -->1 2 3 nil 5 6
end
--Sample_2:
local tab3 =
{
[] = ,
[] = ,
[] = ,
} print("table.maxn:"..table.maxn(tab3)) -->4
for i = , table.maxn(tab2) do
print(tab3[i]) -->nil 2 3 4 nil nil
end

Lua table移除某一项,或多项内容

  有两种方式来移除table中的数据

1. 按下标来移除

  table.remove(table_name, [pos,])
  直接移除某个下标的数据,例如:

local t = {, , , }
table.remove(t, )
for k, v in pairs(t) do
print(k, v)
end
输出

2.将某项值置空

  table[k] = nil  直接将某项值置空

  

local a = {
[''] = ,
[''] = ,
[''] = ,
[''] =
} a[''] = nil for k, v in pairs(a) do
print(k, v)
end 输出:

lua中table的遍历,以及删除的更多相关文章

  1. lua中 table 元表中元方法的重构实现

    转载请标明出处http://www.cnblogs.com/zblade/ lua作为游戏的热更新首选的脚本,其优势不再过多的赘述.今天,我主要写一下如何重写lua中的元方法,通过自己的重写来实现对l ...

  2. lua中 table 重构index/pairs元方法优化table内存占用

    转载请标明出处http://www.cnblogs.com/zblade/ lua作为游戏的热更新首选的脚本,其优势不再过多的赘述.今天,我主要写一下如何重写lua中的元方法,通过自己的重写来实现对l ...

  3. lua中 table.getn(t) 、#t、 table.maxn(t) 这三个什么区别?

    lua中 table.getn(t) .#t. table.maxn(t) 这三个什么区别? RTlocal t = {1,888,x= 999,b=2,5,nil,6,7,[10]=1,8,{z = ...

  4. lua中table如何安全移除元素

    在Lua中,table如何安全的移除元素这点挺重要,因为如果不小心,会没有正确的移除,造成内存泄漏. 引子 比如有些朋友常常这么做,大家看有啥问题 将test表中的偶数移除掉local test = ...

  5. Lua中table的实现-《Lua设计与实现》

    本文来自<Lua设计与实现>的阅读笔记,推荐Lua学习者可以购买一本,深入浅出讲解lua的设计和实现原理,很赞,哈哈   Lua中对于表的设计,是基于数组和散列表,和其他语言不同,对于数组 ...

  6. Java中ArrayList循环遍历并删除元素的陷阱

    ava中的ArrayList循环遍历并且删除元素时经常不小心掉坑里,昨天又碰到了,感觉有必要单独写篇文章记一下. 先写个测试代码: import java.util.ArrayList; public ...

  7. C++对Lua中table进行读取、修改和创建

    C++代码: // LuaAndC.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #i ...

  8. Lua中Table的学习

    --table 是 Lua 的一种数据结构,用来帮助我们创建不同的数据类型,如:数组.字典等 --Lua也是通过table来解决模块(module).包(package)和对象(Object)的. 例 ...

  9. lua中table的常用方法

    转载:https://blog.csdn.net/Fenglele_Fans/article/details/83627021 1:table.sort() language = {"lua ...

随机推荐

  1. VB 半透明窗体

    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVa ...

  2. atom那些事儿

    基于electron(Electron 的底层基于Chromium 和node.js)

  3. DRF分页组件

    为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来, 这样会给内存造成特别大的压力,有可能 ...

  4. BZOJ.5339.[TJOI2018]教科书般的亵渎(拉格朗日插值) & 拉格朗日插值学习笔记

    BZOJ 洛谷 题意的一点说明: \(k\)次方这个\(k\)是固定的,也就是最初需要多少张亵渎,每次不会改变: 因某个怪物死亡引发的亵渎不会计分. 不难发现当前所需的张数是空格数+1,即\(m+1\ ...

  5. python基础一 ------可迭代类型的连接

    对可迭代迭代进行连接,返回一个可迭代对象 两种方式: 并行连接 zip() 串行连接 itertools.chain from itertools import chain #并行连接 print(& ...

  6. synchronized(){}同步代码块笔记(新手笔记,欢迎纠正)

    /* 内容:同步代码块,目的是解决多线程中的安全问题.什么安全问题呢??就是在执行run方法时,假如线程-0刚刚获得执行权, *还没执行时,就挂那了,这时线程-1获得执行权,并进行执行,就有可能出现负 ...

  7. 多轴APM飞控调参

    调参步骤: 遥控器,电动机和电调对应的APM飞控连线——遥控器校准——电调行程校准——加速度计校准——磁罗盘校准——故障保护设定(遥控器和飞控)——飞行模式设定并调整——自动调参设定选项 APM飞控调 ...

  8. C++程序设计方法3:函数重写

    派生类对象包含从基类继承类的数据成员,他们构成了“基类子对象”基类中的私有成员,不允许在派生类成员函数中被访问,也不允许派生类的对象访问他们:真正体现基类私有,对派生类也不开放其权限:基类中的公有成员 ...

  9. egret键盘事件监听

    document.addEventListener("keydown", function (event: any) { //alert(event.key); //console ...

  10. Django中提供的6种缓存方式

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用: 缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...