Lua 學習之基礎篇四


table 是 Lua 的一種數據結構用來幫助我們創建不同的數據類型,如:數組、字典等。
Lua table 使用關聯型數組,你可以用任意類型的值來作數組的索引,但這個值不能是 nil。
Lua table 是不固定大小的,你可以根據自己需要進行擴容。
Lua也是通過table來解決模塊(module)、包(package)和對象(Object)的。 例如string.format表示使用”format”來索引table string。

table(表)的構造

構造器是創建和初始化表的表達式。表是Lua特有的功能強大的東西。最簡單的構造函數是{},用來創建一個空表。可以直接初始化數組:

-- 初始化表
mytable = {}

-- 指定值
mytable[1]= "Lua"

-- 移除引用
mytable = nil 
-- lua 垃圾回收會釋放內存

當我們為 table a 並設置元素,然后將 a 賦值給 b,則 a 與 b 都指向同一個內存。如果 a 設置為 nil ,則 b 同樣能訪問 table 的元素。如果沒有指定的變量指向a,Lua的垃圾回收機制會清理相對應的內存。

-- 簡單的 table
mytable = {}
print("mytable 的類型是 ",type(mytable))

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


-- alternatetable和mytable的是指同一個 table
alternatetable = mytable
print(alternatetable)
print(mytable)

print("alternatetable 索引為 1 的元素是 ", alternatetable[1])
print("alternatetable 索引為 wow 的元素是 ", alternatetable["wow"])

alternatetable["wow"] = "修改后"

print("mytable 索引為 wow 的元素是 ", mytable["wow"])

-- 釋放變量
alternatetable = nil
print("alternatetable 是 ", alternatetable)

-- mytable 仍然可以訪問
print("mytable 索引為 wow 的元素是 ", mytable["wow"])

mytable = nil
print("mytable 是 ", mytable)
mytable 的類型是 	table
mytable 索引為 1 的元素是 	Lua
mytable 索引為 wow 的元素是 	修改前
table: 0x7fd2994074f0
table: 0x7fd2994074f0
alternatetable 索引為 1 的元素是 	Lua
alternatetable 索引為 wow 的元素是 	修改前
mytable 索引為 wow 的元素是 	修改后
alternatetable 是 	nil
mytable 索引為 wow 的元素是 	修改后
mytable 是 	nil

Table的訪問

myTable[3]          --當鍵是數字的時候,只有一種訪問方式
myTable.name        --當鍵是字符串的時候有兩種訪問方式
myTable["name"]

Table操作

  • table.concat (list [, sep [, i [, j]]])

concat是concatenate(連鎖,連接)的縮寫,table.concat()函數列出參數中指定table的數組部分從start位置到end 的所有元素,元素見以指定的分隔符(sep)隔開

fruits = {"banana","orange","apple"}
-- 返回 table 連接后的字符串
print("連接后的字符串 ",table.concat(fruits))

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

-- 指定索引來連接 table
print("連接后的字符串 ",table.concat(fruits,", ", 2,3))
連接后的字符串 	bananaorangeapple
連接后的字符串 	banana, orange, apple
連接后的字符串 	orange, apple
  • table.insert (list, [pos,] value)

在table的數組部分指定位置(pos)插入值為value的一個元素,pos參數可選,默認為數組部分末尾

fruits = {"banana","orange","apple"}

-- 在末尾插入
table.insert(fruits,"mango")
print("索引為 4 的元素為 ",fruits[4])

-- 在索引為 2 的鍵處插入
table.insert(fruits,2,"grapes")
print("索引為 2 的元素為 ",fruits[2])

for k,v in ipairs(fruits) do
    print (k,v)
end

輸出如下:
索引為 4 的元素為 	mango
索引為 2 的元素為 	grapes
1	banana
2	grapes
3	orange
4	apple
5	mango
  • table.move (a1, f, e, t [,a2])

將a1中[f,e]范圍內的元素拷貝到a2[t,t+e-f]范圍內,拷貝內容為a1對應下標所含內容,有則copy。

t = {"12", 34, [8] = "56", m="78", n=90}
t1 = {}
table.move(t, 1, 3, 3, t1) 
--把t中下標key為1-3的元素copy到t1 key為3-5的,t1的元素取決於t中范圍內的元素
print("t: ")
    print(i, v) 
end
print("t1: ")
for i,v in pairs(t1) do 
    print(i, v) 
end
t: 
1	12
2	34
8	56
n	90
m	78
t1: 
4	34
3	12
  • table.remove (list [, pos])

返回table數組部分位於pos位置的元素,其后的元素會被前移,pos參數可選,默認為table長度,即從最后一個元素刪起。

local tabLanguage = { 
    "Assemblylanguage",
    "Lua",
    "c",
    "c++",
    "swift",
    "java",
    "python",
    "ruby"
};

for k,v in pairs(tabLanguage) do
    print(k,v)
end
print("LUA>>>>>>the length of table tabLanguage :", #tabLanguage, "\n")


-- 刪除元素
table.remove(tabLanguage)

table.remove(tabLanguage)
for k,v in pairs(tabLanguage) do
    print(k,v)
end
print("LUA>>>>>>the length of table tabLanguage :", #tabLanguage, "\n")


-- 刪除元素
local removeitem = table.remove(tabLanguage, 3)
for k,v in pairs(tabLanguage) do
    print(k,v)
end
print("LUA>>>>>>the length of table tabLanguage :", #tabLanguage, "\n")
print("remove data of tabLanguage is : "..removeitem)

-- 元素設置nil
tabLanguage[4] = nil;
for k,v in pairs(tabLanguage) do
    print(k,v)
end
print("LUA>>>>>>the length of table tabLanguage :", #tabLanguage, "\n")
輸出如下:
1	Assemblylanguage
2	Lua
3	c
4	c++
5	swift
6	java
7	python
8	ruby
LUA>>>>>>the length of table tabLanguage :	8	

1	Assemblylanguage
2	Lua
3	c
4	c++
5	swift
6	java
LUA>>>>>>the length of table tabLanguage :	6	

1	Assemblylanguage
2	Lua
3	c++
4	swift
5	java
LUA>>>>>>the length of table tabLanguage :	5	

remove data of tabLanguage is : c
1	Assemblylanguage
2	Lua
3	c++
5	java
LUA>>>>>>the length of table tabLanguage :	3
  • table.sort (list [, 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
排序前
1	banana
2	orange
3	apple
4	grapes
排序后
1	apple
2	banana
3	grapes
4	orange

如果有指定comp比較函數,那么sort將按照函數的規則進行排序

local tbl = {
    {id = 1, num = 88, level = 30},
    {id = 2, num = 66, level = 10},
    {id = 3, num = 66, level = 90},
    {id = 4, num = 99, level = 20},
    {id = 5, num = 66, level = 90}
}
 
table.sort(tbl, function(a, b)
    if a.num > b.num then
        -- 按num降序
        return true
    elseif a.num == b.num then
        -- 如果num相等,按level升序
        if a.level < b.level then
            return true
        elseif a.level == b.level then
            -- 如果level相等,按id降序
            return a.id > b.id
        end
    end
    return false
end)
 
for _, v in pairs(tbl) do
    print(string.format("id = %d, num = %d, level = %d", v.id, v.num, v.level))
end
 
-- id = 4, num = 99, level = 20
-- id = 1, num = 88, level = 30
-- id = 2, num = 66, level = 10
-- id = 5, num = 66, level = 90
-- id = 3, num = 66, level = 90


Table的遍歷

Lua 中有默認三種方式遍歷,其中pairs用於迭代元素,ipairs用於迭代數組

關於table-hash內部原理的介紹請參考:table-hash詳解

  • for k,v in pairs(tbtest) do

    但是這種遍歷不是有序輸出

tbtest = {  
    [1] = 1,  
    [2] = 2,  
    [3] = 3,  
    [4] = 4,  
} 
 
for key, value in pairs(tbtest) do  
    print(value)  
end


4
1
2
3
  • for k,v in ipairs(tbtest) do

有序輸出,以tbtest中的key為順序,必須是從1開始,ipairs只會從1開始按連續的key順序遍歷到key不連續為止。

tbtest = {  
    [1] = 1,  
    [2] = 2,  
    [3] = 3,  
    [5] = 5,  
    } 
     
for k,v in ipairs(tbtest) do  
    print(v)  
end 
1
2
3
  • for i=1, #(tbtest) do

'#'是用來獲取table的長度,但這種遍歷方式只能遍歷當tbtest中存在key為1的value時才會出現結果,而且是按照key從1開始依次遞增1的順序來遍歷,否則返回0

tbtest = {  
    ["a"] = 1,  
    ["b"] = 2,  
    ["c"] = 3,  
    }  
    print(#(tbtest)) 

 tbtest = {  
        [1] = 1,  
        [2] = 2,  
        [6] = 6,  
        }  
print(#(tbtest)) 
--0
--2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM