1. 程式人生 > >Lua程式設計筆錄--Lua初識及語法四(陣列,迭代器,table表)

Lua程式設計筆錄--Lua初識及語法四(陣列,迭代器,table表)

Lua 陣列

陣列,就是相同資料型別的元素按一定順序排列的集合,可以是一維陣列和多維陣列。

Lua 陣列的索引鍵值可以使用整數表示,陣列的大小不是固定的。

一維陣列

一維陣列是最簡單的陣列,其邏輯結構是線性表。一維陣列可以用for迴圈出陣列中的元素,如下例項:

array ={"Lua","Tutorial"}for i=0,2doprint(array[i])end

以上程式碼執行輸出結果為:

nilLuaTutorial

正如你所看到的,我們可以使用整數索引來訪問陣列元素,如果知道的索引沒有值則返回nil。

在 Lua 索引值是以 1 為起始,但你也可以指定 0 開始。

多維陣列

多維陣列即陣列中包含陣列或一維陣列的索引鍵對應一個數組。

以下是一個三行三列的陣列多維陣列:

--初始化陣列
array ={}for i=1,3do
   array[i]={}for j=1,3do
         array[i][j]= i*j
      endend--訪問陣列for i=1,3dofor j=1,3doprint(array[i][j])endend

以上程式碼執行輸出結果為:

123246369

Lua 迭代器

迭代器(iterator)是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的地址

在Lua中迭代器是一種支援指標型別的結構,它可以遍歷集合的每一個元素。

泛型 for 迭代器

泛型 for 在自己內部儲存迭代函式,實際上它儲存三個值:迭代函式、狀態常量、控制變數。

泛型 for 迭代器提供了集合的 key/value 對,語法格式如下:

for k, v in pairs(t)doprint(k, v)end

上面程式碼中,k, v為變數列表;pair(t)為表示式列表。

檢視以下例項:

array ={"Lua","Tutorial"}for key,value in ipairs(array)doprint(key, value)end

以上程式碼執行輸出結果為:

1Lua2Tutorial

Lua table(表)

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 操作

以下列出了 Table 操作常用的方法:

序號 方法 & 用途
1 table.concat (table [, sep [, start [, end]]]):

concat是concatenate(連鎖, 連線)的縮寫. table.concat()函式列出引數中指定table的陣列部分從start位置到end位置的所有元素, 元素間以指定的分隔符(sep)隔開。

2 table.insert (table, [pos,] value):

在table的陣列部分指定位置(pos)插入值為value的一個元素. pos引數可選, 預設為陣列部分末尾.

3 table.maxn (table)

指定table中所有正數key值中最大的key值. 如果不存在key值為正數的元素, 則返回0。(Lua5.2之後該方法已經不存在了,本文使用了自定義函式實現)

4 table.remove (table [, pos])

返回table陣列部分位於pos位置的元素. 其後的元素會被前移. pos引數可選, 預設為table長度, 即從最後一個元素刪起。

5 table.sort (table [, comp])

對給定的table進行升序排序。

Table 連線

我們可以使用 concat() 方法來連線兩個 table:

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 的插入和移除操作:

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])

執行以上程式碼輸出結果為:

索引為4的元素為 	mango
索引為2的元素為 	grapes
最後一個元素為 	mango
移除後最後一個元素為nil

Table 排序

以下例項演示了 sort() 方法的使用,用於對 Table 進行排序:

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

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

執行以上程式碼輸出結果為:

排序前1	banana
2	orange
3	apple
4	grapes
排序後1	apple
2	banana
3	grapes
4	orange

Table 最大值

table.maxn 在 Lua5.2 之後該方法已經不存在了,我們定義了 table_maxn 方法來實現。

以下例項演示瞭如何獲取 table 中的最大值:

function table_maxn(t)local mn =0for k, v in pairs(t)doif mn < k then
            mn = k
        endendreturn mn
end
tbl ={[1]="a",[2]="b",[3]="c",[26]="z"}print("tbl 長度 ",#tbl)print("tbl 最大值 ", table_maxn(tbl))

執行以上程式碼輸出結果為:

tbl 長度3
tbl 最大值26