◆ 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使用陣列和雜湊表結合的方式,使...