Lua資料之table函式

2021-12-30 08:59:10 字數 3465 閱讀 7341

◆ table.getn 獲取長度

取長度操作符寫作一元操作 #。字串的長度是它的位元組數(就是以乙個字元乙個位元組計算的字串長度)。對於常規的陣列,裡面從 1 到 n 放著一些非空的值的時候,它的長度就精確的為 n,即最後乙個值的下標。如果陣列有乙個「空洞」(就是說,nil 值被夾在非空值之間),那麼 #t 可能是指向任何乙個是 nil 值的前乙個位置的下標(就是說,任何乙個 nil 值都有可能被當成陣列的結束)。這也就說明對於有「空洞」的情況,table 的長度存在一定的 不可確定性。

local tbltest1 =

print("test1 " .. table.getn(tbltest1))

local tbltest2 =

print("test2 " .. table.getn(tbltest2))

local tbltest3 =

print("test3 " .. table.getn(tbltest3))

local tbltest4 =

print("test4 " .. table.getn(tbltest4))

local tbltest5 =

print("test5 " .. table.getn(tbltest5))

local tbltest6 =

print("test6 " .. table.getn(tbltest6))

使用 lua 5.1 和 luajit 2.1 分別執行這個用例,結果如下:

# lua test.lua

test1 2

test2 1

test3 3

test4 1

test5 3

test6 1

# luajit test.lua

test1 2

test2 1

test3 1

test4 1

test5 1

test6 1

不要在 lua 的 table 中使用 nil 值,如果乙個元素要刪除,直接 remove,不要用 nil 去代替。 

◆ table.concat (table [, sep [, i [, j ] ] ])

對於元素是 string 或者 number 型別的表 table,返回 table[i]..sep..table[i+1] ···

sep..table[j] 連線成的字串。填充字串 sep 預設為空白字串。起始索引位置 i 預設為1,結束索引位置 j 預設是 table 的長度。如果 i 大於 j,返回乙個空字串。

local a =

print(table.concat(a))              -- output: 135hello

print(table.concat(a, "|"))         -- output: 1|3|5|hello

print(table.concat(a, " ", 4, 2))   -- output:

print(table.concat(a, " ", 2, 4))   -- output: 3 5 hello

◆ table.insert (table, [pos ,] value)

在(陣列型)表 table 的 pos 索引位置插入 value,其它元素向後移動到空的地方。pos 的預設值是表的長度加一,即預設是插在表的最後。

local a =             --a[1] = 1,a[2] = 8

table.insert(a, 1, 3)   --在表索引為1處插入3

print(a[1], a[2], a[3])

table.insert(a, 10)    --在表的最後插入10

print(a[1], a[2], a[3], a[4])

-->output

3    1    8

3    1    8    10

◆ table.maxn (table)

返回(陣列型)表 table 的最大索引編號;如果此表沒有正的索引編號,返回 0。

當長度省略時,此函式通常需要 o(n) 的時間複雜度來計算 table 的末尾。因此用這個函式省略索引位置的呼叫形式來作 table 元素的末尾追加,是高代價操作。

local a = {}

a[-1] = 10

print(table.maxn(a))

a[5] = 10

print(table.maxn(a))

-->output05

此函式的行為不同於 # 運算子,因為 # 可以返回陣列中任意乙個 nil 空洞或最後乙個 nil 之前的元素索引。當然,該函式的開銷相比 # 運算子也會更大一些。

◆ table.remove (table [, pos])

在表 table 中刪除索引為 pos(pos 只能是 number 型)的元素,並返回這個被刪除的元素,它後面所有元素的索引值都會減一。pos 的預設值是表的長度,即預設是刪除表的最後乙個元素。

local a =

print(table.remove(a, 1)) --刪除速索引為1的元素

print(a[1], a[2], a[3], a[4])

print(table.remove(a))   --刪除最後乙個元素

print(a[1], a[2], a[3], a[4])

-->output

12    3    4    nil

42    3    nil    nil

◆ table.sort (table [, comp])

按照給定的比較函式 comp 給表 table 排序,也就是從 table[1] 到 table[n],這裡 n 表示 table的長度。 比較函式有兩個引數,如果希望第乙個引數排在第二個的前面,就應該返回 true,否則返回 false。 如果比較函式 comp 沒有給出,預設從小到大排序。

local function compare(x, y) --從大到小排序

return x > y         --如果第乙個引數大於第二個就返回true,否則返回false

endlocal a =

table.sort(a)           --預設從小到大排序

print(a[1], a[2], a[3], a[4], a[5])

table.sort(a, compare) --使用比較函式進行排序

print(a[1], a[2], a[3], a[4], a[5])

-->output

1    3    4    7    25

25    7    4    3    1

◆ table 其他非常有用的函式

luajit 2.1 新增加的 table.new 和 table.clear 函式是非常有用的。前者主要用來預分配lua table 空間,後者主要用來高效的釋放 table 空間,並且它們都是可以被 jit 編譯的。具體可以參考一下 openresty **的 lua-resty-* 庫,裡面有些例項可以作為參考。

Lua 之table的測試

1.字串作為table索引 法1.mytable 法2.mytable 法3.mytable mytable.x xixi 法4.mytable mytable x xixi 注 當使用數字字串作為索引的時候 如 10 法1 錯誤 mytable 法2 mytable 法3 錯誤 mytable m...

Lua學習筆記之table

零散知識點記錄 table的拷貝是淺拷貝,若要深拷貝a b則需要遍歷b中的元素,並將其一一對應賦值給a。乙個table剛初始化時,是沒有metatable的,必須通過setmetatable給table賦予metatable,table才有metatable。所以若想直接用table 來初始化乙個t...

lua之table的使用

本文對從資料結構,儲存和使用三個角度對lua之table的使用進行小結。資料結構 table是lua的一種資料結構,可以用來存放各種型別的元素,例如可以建立陣列和字典,以及二者混合的資料結構,例如 a 陣列 b 字典 c 陣列元素和字典元素混合 儲存 lua的table使用陣列和雜湊表結合的方式,使...