Lua 表 table

-- lua table 表
-- table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
-- Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
-- Lua table 是不固定大小的,你可以根据自己需要进行扩容。
-- Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。

-- table(表)的构造

-- 初始化表
mytable = {}
-- 指定值赋值
mytable[1] = "Lua"
-- 移除引用
mytable = nil 
-- lua垃圾回收会释放内存
-- 当我们为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。如果 a 设置为 nil ,则 b 同样能访问 table 的元素。如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存

mytable = {}
print("mytable 的类型是:",type(mytable))

mytable[1] = "Lua"
mytable["wow"] = "修改前"
print("mytable索引为1的元素是:",mytable[1])
print("mytable索引为wow的元素是:",mytable["wow"])

altertable = mytable
print("altertable索引为1的元素是:",altertable[1])
print("altertable索引为wow的元素是:",altertable["wow"])

altertable["wow"] = "修改后"
print("mytable索引为wow的元素是:",mytable["wow"])
print("altertable索引为wow的元素是:",altertable["wow"])

-- 释放变量
altertable = nil
print("altertable 是:",altertable)

print("mytable 索引为wow的元素是:",mytable["wow"])
mytable = nil
print("mytable是:",mytable)

-- table 操作

-- Table 连接
-- table.concat (table [, sep [, start [, end]]]):
-- concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开

fruits = {"banana","orange","apple"}
print("连接后的字符串:",table.concat(fruits))

-- 指定连接字符
print("连接后的字符串:",table.concat(fruits,","))

-- 指定起始索引来连接table
print("连接后的字符串:",table.concat(fruits,",",2,3))

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

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

fruits = {"banana","orange","apple"}
-- 在末尾插入
table.insert(fruits,"mango")
print("索引为4的元素为",fruits[4])

-- 在索引为2的键处插入
table.insert(fruits,2,"grapes")
print("索引为2的元素为",fruits[2])

print("最后一个元素为",fruits[5])
table.remove(fruits)
print("移除后最后一个元素为",fruits[5])

-- table 排序
-- table.sort (table [, comp])
-- 对给定的table进行升序排序。

fruits = {"banana","orange","apple","grapes"}
print("排序前")
for k,v in ipairs(fruits) do
    print(k,v)
end

table.sort(fruits)
print("排序后")
for k,v in ipairs(fruits) do
    print(k,v)
end

-- Table 最大值
-- table.maxn (table)
-- 指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0
-- table.maxn 在 Lua5.2 之后该方法已经不存在了,我们定义了 table_maxn 方法来实现

function table_maxn(t)
    local mn=nil
    for k,v in pairs(t) do
        if(mn==nil) then
            mn=v
        end
        if mn < v then
            mn=v
        end
    end
    return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
print("tbl最大值:",table_maxn(tbl))
print("tbl长度",#tbl)
-- 当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度

function table_leng(t)
    local leng = 0
    for k,v in pairs(t) do
        leng = leng + 1
    end
    return leng 
end
print("tbl长度",table_leng(tbl))