LUA 中table的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LUA 中table的方法相关的知识,希望对你有一定的参考价值。

LUA 中table的方法都有什么?最好说的详细点

在Lua中,table(表)是主要的数据结构(事实上也仅此一种),数组则是table的一种特殊应用。

                                                                                                ——table的介绍

  lua中,有预加载的table库。

       在这个table库中包含了如下函数:

    setn

    insert

    getn

    foreachi

    maxn

    foreach

    concat

    sort

    remove

        要调用它们,使用table.函数名(参数列表)。

demo:

        print(table.maxn(1,2,3))     --> 获取table的最大长度

        table.sort(table)                    --> 给表table排序

        table.insert(table,"Hi")          --> 给table增加下标为1的"Hi"元素 

        print(table[1])                        --> Hi

        table.remove(table,1)            --> 给table删除下标为1的元素

        print(table[1])                        --> nil

参考技术A table是表

如果你是想问table有那些相关的操作函数的话

我就说几个常见的吧

table.sort()
table.insert()
table.remove()
table.concat()
1 排序 23 插入删除 4 字符串连接

其他还有 不过用的比较少就是了
参考技术B table是表,我们可以先新建一个table:
table1 = 1,2,3,4,5
使用table名字[第几个元素]可以快速访问table指定位置的元素,刚刚已经新建了一个table
现在用这个方法访问
local a = table1[1]
print(a)
结果:1
同样也可以使用.访问:
print(table1.3)
结果:3
table操作:
table.concat (table [, sep [, start [, end]]])
连接table中start到end之间的所有元素,元素间用sep隔开
table.insert(table,[pos,]value)
在table中pos位置插入value(pos可选,如果不指定,默认为table结尾)
table.remove(table,[pos])
返回并删除table中pos位置的元素,pos可选,如果不指定,默认为table结尾
table.sort(table,[pos])
给table进行升序或降序排序
参考技术C 没懂你的意思。
不知道你说的是操作table的基本方法还是其它什么。

lua中,两种json和table互转方法的效率比较

lua中json和table的互转,是我们在平时开发过程中经常用到的。比如:
  1. 在用lua编写的服务器中,如果客户端发送json格式的数据,那么在lua处理业务逻辑的时候,必然需要转换成lua自己的数据结构,如table。此时,就会用到table和json格式的互转。
  2. 在用lua编写的服务器中,如果我们通过redis来存储数据,由于redis中不存在table这种数据结构,因此,我们可以选择将table转换成json字符串来进行存储。在数据的存取过程中,也会用到table和json格式的互转。

以上两种场景中,json和table的互转使用频率是非常高的,如果转换效率有提升,对于降低我们业务延时将会有很大的帮助。因此,选择一种高效率的转换方式的重要性可见一斑。

下面我们简单介绍两种转换方式,并对他们的转换效率做一个对比。

  1. 第一种是用lua实现的json和table互转方式,这种比较常见,需要了解使用方法及源码,请访问该项目在github上的源码。
  2. 第二种叫cjson,是用C实现的。redis中的eval命令支持lua操作数据库,因此,cjson也在redis中得到使用,我们可以redis的源码库中拉倒cjson的源码
下面简单对比一下,分别通过这两种方式转换的效率,到底差多少?
测试方法:创建一个lua中的table,反复将lua转换成json,再将json转换成lua,如此循环多次,此处我们循环50000次,并且在每次转换过程中,对其中一个变量count进行递增计算,便于我们最终来检验转换过程中数据的正确性。
    local t = {
        a = "hello",
        b = "world",
        c = 123456,
        d = "123456",
        e = {"hhh", "11", "22"},
        f = {
            a = "hello",
            b = "world",
            c = 123456,
            d = "123456",
            e = {"hhh", "11", "22"},
            count = 0
        }
    }
    local tm1 = os.time()
    local str_json = ""
    for i = 1, 50000, 1 do
        --str_json = json.encode(t)
        --t = json.decode(str_json)
        str_json = cjson.encode(t)
        t = cjson.decode(str_json)
        t.f.count = t.f.count + 1
    end
    local tm2 = os.time()
    print("tm1:" .. tm1 .. ",tm2:" .. tm2 .. ",dt:" .. (tm2 - tm1))
    print(str_json)
结果1:使用json转换后的输出,耗时为51秒。
tm1:1575363384,tm2:1575363435,dt:51
{"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","f":{"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","count":49999}}
结果2:使用cjson转换后输出,耗时为5秒。
tm1:1575363457,tm2:1575363462,dt:5
{"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","f":{"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","count":49999}}
结论:
通过上面的实验,可以看到,通过cjson的转换效率基本是通过lua实现的json.encode()和json.decode()的10倍。

以上是关于LUA 中table的方法的主要内容,如果未能解决你的问题,请参考以下文章

lua 中有快速清空table的函数或者方法没

c++ 遍历lua table方法 如图

lua的table转为excel表格的方法

lua 4 使用table实现其他数据结构,并介绍遍历方法

lua 元方法 __index

Lua-面向对象中类的构造