• lua中table的遍历,以及删除


    Lua 内table遍历

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

    1. ipairs

    for index, value in ipairs(table) do

    end

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

     1 --Sample_1:
     2 local tab1 = 
     3 {
     4 [1] = 1,
     5 [2] = 2,
     6 [3] = 3,
     7 [4] = 4,
     8 }
     9 for key, value in ipairs(tab1) do
    10   print(value)    -->1 2 3 4
    11 end
    --Sample_2:
    local tab2 = 
    {
        [1] = 1,
        [2] = 2,
        [3] = 3,
        [5] = 5,
        [6] = 6,
    }
    for key, value in ipairs(tab2) do
        print(value)    -->1 2 3
    end
    --Sample_3:
    local tab3 = 
    {
        [2] = 2,
        [3] = 3,
        [4] = 4,
    }
    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 = 
    {
        [1] = 1,
        [2] = 2,
        [3] = 3,
        [4] = 4,
    }
     
    for key, value in pairs(tab1) do
        print(value)    -->1 2 4 3
    end
    --Sample_2:
    local tab2 = 
    {
        [1] = 1,
        [2] = 2,
        [3] = 3,
        [5] = 5,
        [6] = 6,
    }
    for key, value in pairs(tab2) do
        print(value)    -->6 2 3 1 5
    end
    --Sample_3:
    local tab3 = 
    {
        ["1"] = 1,
        ["2"] = 2,
        ["3"] = 3,
        ["5"] = 5,
        ["6"] = 6,
    }
    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 = 
    {
        [1] = 1,
        [2] = 2,
        [3] = 3,
        [4] = 4,
    }
     
    print("#table:"..#(tab1))        -->4
    for i = 1, #(tab1) do
        print(tab1[i])    -->1 2 3 4
    end
     
    --Sample_2:
    local tab2 = 
    {
        [1] = 1,
        [2] = 2,
        [3] = 3,
        [5] = 5,
        [6] = 6,
    }
     
    print("#table:"..#(tab2))    -->3
    for i = 1, #(tab2) do
        print(tab2[i])
    end
    --Sample_3:
    local tab3 = 
    {
        [2] = 2,
        [3] = 3,
        [4] = 4,
    }
     
    print("#table:"..#(tab3))    -->0
    for i = 1, #(tab3) do
        print(tab3[i])    -->没有打印
    end

    4. table.maxn(table)

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

    local tab2 = 
    {
        [1] = 1,
        [2] = 2,
        [3] = 3,
        ["a"] = 4,
        [5] = 5,
        [6] = 6,
    }
     
    print("table.maxn:"..table.maxn(tab2))    -->6
    for i = 1, table.maxn(tab2) do
        print(tab2[i])    -->1 2 3 nil 5 6
    end
    --Sample_2:
    local tab3 = 
    {
        [2] = 2,
        [3] = 3,
        [4] = 4,
    }
     
    print("table.maxn:"..table.maxn(tab3))    -->4
    for i = 1, 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 = {5, 6, 7, 8}
    table.remove(t, 2)
    for k, v in pairs(t) do
        print(k, v)
    end
    输出
    1     5
    2     7
    3     8

    2.将某项值置空

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

      

    local a = {
        ['3019'] = 3019,
        ['3020'] = 3020,
        ['3021'] = 3021,
        ['3017'] = 3017
    }
    
    a['3019'] = nil
    
    for k, v in pairs(a) do
        print(k, v)
    end
    
    输出:
    3020    3020
    3017    3017
    3021    3021
  • 相关阅读:
    TSINGSEE青犀视频云边端架构产品EasyNVR/EasyGBS/EasyDSS区别及应用场景介绍
    【解决方案】TSINGSEE青犀视频云边端架构产品如何实现明厨亮灶汇总直播方案?
    【开发记录】RTSP/GB28181/Ehome协议安防视频服务平台EasyCVR使用golang orm操作数据库及基本使用步骤
    TSINGSEE青犀视频云边端架构产品是如何实现视频流传输的?
    【开发记录】安防视频上云服务云平台EasyCVR部署之docker部署步骤参考说明
    TSINGSEE青犀视频+海康合作研发RTMP推流摄像头出现无法推流或无法上线的情况如何配置?
    VC中利用管道技术取得DOS或者命令行以及外部程序的执行结果
    系统程序员成长计划拥抱变化(下)
    系统程序员成长计划Write once, run anywhere(WORA)(下)
    KJava虚拟机hack笔记编译
  • 原文地址:https://www.cnblogs.com/slysky/p/10419802.html
Copyright © 2020-2023  润新知