连串难点集(2)—— Lua 中table的遍历

发布时间:2019-05-17  栏目:MyBatis  评论:0 Comments

Lua table数据如下:

品类中有不少配置表的数额剖析出来都是用表接收的,所以一时会用到对表的遍历。可是由于表中积攒的多寡的结构不等同,所以遍历的法门也是不一致等的,有大致的表,直接存款和储蓄接二连三数组的,也许有存款和储蓄list的,也许有囤积字典的,因为数量剖判都以从C#分析过来的。
 

图片 1

1:轻易数字型的,这种是最简便易行的,内部存款和储蓄的是粗略的数字

local table1 = {-1,15,10,20};

for k,v in pairs(table1) do

       print(k,v);                                                    
 

end

for k,v in pairs (table1) do 

     print(v);

end

for i = 1, #table1 do 

       print(i);

end

打字与印刷出来的结果都以:-一,15,十,20。方法二里边带上了序号。当然数组里面也足以不是数字,别的的数据类型也是足以的,比如string类型

当数组不接二连三的时候,也是能够的用地点二种办法的。

local table1 = {-1,15,10,20};

table1[6] = “laowang”;

for k,v in ipairs(table1) do 

     print(k,v);

end

for k,v in pairs(table1) do 

    print(k,v);

end

for i-1, #table1 do 

     print(i);

end

打字与印刷出来的结果是:-一,1五,拾,20。-1,一五,十,20,laowang。-一,1五,十,20,nil,老王。很显然也是足以遍历的。ipairs是蒙受nil停止遍历。

复制代码 代码如下:

贰:键值对项目标table

键值对品种的table只用使用table自带的迭代器(pairs和ipairs)来拓展遍历,因为这时候的table无法经过#来得到长度

local table2 = {key1 = 1, b=2, C = 4};

for k,v in pairs(table2) do 

     print(k,v);

end

打字与印刷的结果是:key一   一, b    贰,C   四;
 不过并未有艺术通过#table2来获取table2的长度

–$ cat test.lua lua文件
user = {
        [“name”] = “zhangsan”,
        [“age”] = “22”,
        [“friend”] = {
                [1] = {
                    [“name”] = “小丽”,
                    [“sex”] = “女”,
                    [“age”] = “20”,
                },
                [2] = {
                    [“name”] = “小罗”,
                    [“sex”] = “男”,
                    [“age”] = “20”,
                },
            },
        }

三:userData类型的数码就平昔遵照连串来遍历就能够

因为工作中时时遇到数据分析,深入分析后的数量恐怕是list,也说不定是字典。当用lua来遍历那体系型的数码时,就直接用list和字典的遍历格局遍历就能够。

要读出地点table 中兼有数据,C++代码如下:

四:pais,ipairs和#的区别

那多少个相当重要字的区分是和table的定义有密切关系的。

复制代码 代码如下:

#长度

local table1 = {0,2,3,4};

local table2 = {[1] = 0, [2]=2,[3] = 3,[4] = 4};

local table3 = {[0] = 0, [1]=2, [2] = 3, [3]=4};

print(table1[0]);

print(table1[1]);

print(table2[0]);

print(table2[1]);

print(table3[0]..”  “..table3[1]);

打字与印刷的结果是:nil    0, nil    0,0    
2;从那一点能够很显明的看出来,暗许像数组同样定义出来的table是从索引为一从头的。可是和数组不一样样的一些时,table中索引是能够本身定义的,可以从随机数字开始,而且索引也是能够任性的

例如:local table4 = {[2]=3, [5]=4, [10]=0, [-1]=2};

如此定义的话,table是未有0,一索引的,是从贰号索引初阶的。同时是有-一索引值的。

对上面4个table做#运算会发掘,table1的长度是四,table二是4,table三是三,table四是0。再定义上边包车型客车table五,获取其长度

local table5={[2]=2, [3]=3, [4]=4};

获取的长短是0。从那点能够见见,#标识是和索引一相关的,利用#求3个的长短时,lua会遍历这么些表,从中查找索引1,假使未有一号索引,就输出0,假使有一号索引,就向后逐1依据索引递增查找,直到索引递增中断

例如:local table6={[0]=0, [1]=1, [2]=2, [5] = 5};

通过#收获的长短只是2,因为未有叁号索引,由此lua就搁浅了寻找游为,输出了贰。

//C++代码:
#include <lua.hpp>
#include <iostream>
#include <string>
using namespace std;
 
bool popTable(lua_State* L, int idx)
{
    try{
        lua_pushnil(L);
        while(lua_next(L, idx) != 0){
            int keyType = lua_type(L, -2);
            if(keyType == LUA_TNUMBER){
                double value = lua_tonumber(L, -2);
                cout << “Key:” << value << endl;
            }else if(keyType == LUA_TSTRING){
                const char*  value = lua_tostring(L, -2);
                cout << “Key:” << value << endl;
            }else{
                cout << “Invalid key type: ” << keyType
<< endl;
                return false;
            }
            int valueType = lua_type(L, -1);
            switch(valueType){
                case LUA_TNIL:
                {
                    cout << “Value: nil” << endl;
                    break;
                }
                case LUA_TBOOLEAN:
                {
                    int value = lua_toboolean(L, -1);
                    cout << value << endl;
                    break;
                }
                case LUA_TNUMBER:
                {    cout << “Value:” << lua_tonumber(L,
-1) << endl;
                    break;
                }
                case LUA_TSTRING:
                {
                    cout << “Value:” << lua_tostring(L, -1)
<< endl;
                    break;
                }
                case LUA_TTABLE:
                {
 
                    cout << “====sub table===” << endl;
                    int index = lua_gettop(L);
                    if (!popTable(L, index)) {
                        cout << “popTable error in  popTable,error
occured” << endl;
                        return false;
                    }
                    break;
                }
                default:
                {
                    cout << “Invalid value type: ” <<
valueType << endl;
                    return false;
                }
            }
            lua_pop(L, 1);
        }
    }catch(const char* s){
       string errMsg = s;
       lua_pop(L,1);
       cout << errMsg << endl;
       return false;
    }catch(std::exception& e){
        const char* errMsg = e.what();
        lua_pop(L,1);
        cout << errMsg << endl;
        return false;
    }catch(…){
        const char* errMsg = lua_tostring(L,-1);
        lua_pop(L,1);
        cout << errMsg << endl;
        return false;
    }
    return true;
}
 
 
int main(int argc, char* argv)
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    int r = luaL_dofile(L,”./test.lua”);
    lua_getglobal(L, “user”);
    int type = lua_type(L,1);
    if(type == LUA_TTABLE){
        int index = lua_gettop(L);
        if(popTable(L,index)){
            return 0;
        }else{
            cout << “Error” << endl;
            return -1;
        }
    }
    return 0;
}

ipairs遍历

是依据key值的深浅顺序来遍历的,而且,key值一定若是连接的,境遇不接二连三的地方,就能够结束遍历。

例如:local table1 = {[1]=1, [2]=2, [3]=3, [5]=4};

local table2 = {[0]=1, [1]=2, [2]=3, [3]=4};

local table3 = {[2]=2, [3]=3, [4]=4};

for k,v in ipairs(table1) do

      print(k,v);

end

for k,v in ipairs(table2) do

      print(k,v);

end

for k,v in ipairs(table3) do

      print(k,v);

end

打印的结果是:一  一, 2  二, 三   叁和 一  一, ②   叁, 叁 四。第八个从未出口结果。因而能够的到那样的结论,ipairs是只遍历table中,索引从一方始,以一递增的1对。碰到索引中断,就过逝实践。那或多或少和#稍稍相似。

运营结果:

pairs遍历

pairs遍历是唯一的能够遍历table中装有因素的艺术,可是也格外,正是遍历的顺序不是坚守key的定义顺序来的,而是遵从key只的哈希值来遍历的。当然,若是遍历的是轻巧的数组样式的table,顺序是不会乱的,可是若是人为定义了key值,那么顺序将会迥然不一致。

复制代码 代码如下:

问题

地点说过,#的遍历是从壹初叶,境遇不一而再就能够停下,然则在好几情况下,也有例外:

例如:local table1={[1]=1, [2]=2, [3]=3, [5]=5};

lcoal tabe2 = {[1]=1, [2]=2, [4] =4, [5] = 5};

地方两个table的#运算结果个别是三和伍。这种场合仿佛是和中间key值有提到,当key值满意2的指数时,就足以一贯遍历,并且和偶数也许有关联,情状比较复杂。

上述有繁多都以参谋的那位大神的,上边都是参照整理的。http://rangercyh.blog.51cto.com/all/1444712/9

$ ./cpptable.linux_64_gcc4
Key:age
Value:22
Key:name
Value:zhangsan
Key:friend
====sub table===
Key:2
====sub table===
Key:sex
Value:男
Key:age
Value:20
Key:name
Value:小罗
Key:1
====sub table===
Key:sex
Value:女
Key:age
Value:20
Key:name
Value:小丽

你或然感兴趣的文章:

留下评论

网站地图xml地图