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