zoukankan      html  css  js  c++  java
  • lua table函数库

    Lua中的table函数库

    一部分的table函数只对其数组部分产生影响, 而另一部分则对整个table均产生影响. 下面会分开说明. 


    table.concat(table, sep,  start, end)

    concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。除了table外, 其他的参数都不是必须的, 分隔符的默认值是空字符, start的默认值是1, end的默认值是数组部分的总长.

    sep, start, end这三个参数是顺序读入的, 所以虽然它们都不是必须参数, 但如果要指定靠后的参数, 必须同时指定前面的参数.

     tbl = {"alpha", "beta", "gamma"}
     print(table.concat(tbl, ":"))
     print(table.concat(tbl, nil, 1, 2))
     print(table.concat(tbl, "\n", 2, 3))

    alpha:beta:gamma
    alphabeta
    beta
    gamma

    table.insert(table, pos, value)

    table.insert()函数在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.

    tbl = {"alpha", "beta", "gamma"}
    table.insert(tbl, "delta")
    table.insert(tbl, "epsilon")
    table.insert(tbl, 3, "zeta")
    print(table.concat(tbl,","))
    


    alpha,beta,zeta,gamma,delta,epsilon

    table.maxn(table)

    table.maxn()函数返回指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0. 此函数不限于table的数组部分.

    tbl = {[1] = "a", [2] = "b", [3] = "c", [26] = "z"}
    print(#tbl)
    print(table.maxn(tbl))
    tbl[91.32] = true
    print(table.maxn(tbl))
    


    3  --因为数组不连续
    26
    91.32


    table.remove(table, pos)

    table.remove()函数删除并返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起.

    tbl = {[1] = "a", [2] = "b", [3] = "c", [26] = "z"}
    table.remove(tbl)
    print(table.concat(tbl,","))
    table.remove(tbl,3)
    print(table.concat(tbl,","))
    

    a,b
    a,b


    table.sort(table, comp)

    table.sort()函数对给定的table进行升序排序.

    comp是一个可选的参数, 此参数是一个外部函数, 可以用来自定义sort函数的排序标准.

    此函数应满足以下条件: 接受两个参数(依次为a, b), 并返回一个布尔型的值, 当a应该排在b前面时, 返回true, 反之返回false.

    function sortAsc(a, b)
    	return a > b
    end
    tbl = {"alpha", "beta", "gamma", "delta"}
    tblNum = {1,3,5,7,9,2,4,6,8,10}
    table.sort(tbl)
    table.sort(tblNum)
    print(table.concat(tbl, ", "))
    print(table.concat(tblNum, ", "))
    table.sort(tblNum, sortAsc)
    print(table.concat(tblNum, ", "))
    

    alpha, beta, delta, gamma
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    10, 9, 8, 7, 6, 5, 4, 3, 2, 1

    用类似的原理还可以写出更加复杂的排序函数. 例如, 有一个table存有工会三名成员的姓名及等级信息:

    guild = {}

    table.insert(guild, {
     name = "Cladhaire",
     class = "Rogue",
     level = 70,
    })

    table.insert(guild, {
     name = "Sagart",
     class = "Priest",
     level = 70,
    })

    table.insert(guild, {
     name = "Mallaithe",
     class = "Warlock",
     level = 40,
    })


    对这个table进行排序时, 应用以下的规则: 按等级升序排序, 在等级相同时, 按姓名升序排序.

    可以写出这样的排序函数:

    function sortLevelNameAsc(a, b)
     if a.level == b.level then
      return a.name < b.name
     else
      return a.level < b.level
     end
    end

    测试功能如下:

    > table.sort(guild, sortLevelNameAsc)
    > for idx, value in ipairs(guild) do print(idx, value.name) end
    1, Mallaithe
    2, Cladhaire
    3, Sagart

    table.foreachi(table, function(i, v))
    会期望一个从 1(数字 1)开始的连续整数范围,遍历table中的key和value逐对进行function(i, v)操作

    t1 = {2, 4, 6, language="Lua", version="5", 8, 10, 12, web="hello lua"};
    table.foreachi(t1, function(i, v) print (i, v) end) ; --等价于foreachi(t1, print)
    



    输出结果:
    1 2
    2 4
    3 6
    4 8
    5 10
    6 12

    table.foreach(table, function(i, v))
    与foreachi不同的是,foreach会对整个表进行迭代

    t1 = {2, 4, 6, language="Lua", version="5", 8, 10, 12, web="hello lua"};
    table.foreach(t1, function(i, v) print (i, v) end) ;
    



    输出结果:
    1 2
    2 4
    3 6
    4 8
    5 10
    6 12
    web hello lua
    language Lua
    version 5

    table.getn(table)
    返回table中元素的个数

    t1 = {1, 2, 3, 5};
    print(getn(t1))
    ->4

    table.setn(table, nSize)
    设置table中的元素个数

  • 相关阅读:
    Proj THUDBFuzz Paper Reading: PMFuzz: Test Case Generation for Persistent Memory Programs
    入围 WF 后训练记
    算法竞赛历程
    2021 多校 杭电 第十场
    2021 多校 杭电 第九场
    2021 多校 牛客 第十场
    2021 多校 牛客 第九场
    2021 多校 杭电 第八场
    2021 多校 杭电 第六场
    2021 多校 杭电 第七场
  • 原文地址:https://www.cnblogs.com/byfei/p/14104590.html
Copyright © 2011-2022 走看看