# 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
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?索引為?1?的元素是?",?alternatetable[1])
print("mytable?索引為?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?的元素是????修改前
alternatetable?索引為?1?的元素是???Lua
mytable?索引為?wow?的元素是????修改前
mytable?索引為?wow?的元素是????修改后
alternatetable?是????nil
mytable?索引為?wow?的元素是????修改后
mytable?是???nil
~~~
~~~
### Table 操作
以下列出了 Table 操作常用的方法:
| 方法 | 用途 |
|-----|-----|
| **table.concat (table [, step [, start [, end]]]):** | concat是concatenate(連鎖, 連接)的縮寫. table.concat()函數列出參數中指定table的數組部分從start位置到end位置的所有元素, 元素間以指定的分隔符(sep)隔開。 |
| **table.insert (table, [pos,] value):** | 在table的數組部分指定位置(pos)插入值為value的一個元素. pos參數可選, 默認為數組部分末尾. |
| **table.maxn (table)** | 指定table中所有正數key值中最大的key值. 如果不存在key值為正數的元素, 則返回0。(**Lua5.2之后該方法已經不存在了,本文使用了自定義函數實現** ) |
| **table.remove (table [, pos])** | 返回table數組部分位于pos位置的元素. 其后的元素會被前移. pos參數可選, 默認為table長度, 即從最后一個元素刪起。 |
| **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)?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
~~~
~~~
### Table 最大值
table.maxn 在 Lua5.2 之后該方法已經不存在了,我們定義了 table_maxn 方法來實現。
以下實例演示了如何獲取 table 中的最大值:
~~~
~~~
function?table_maxn(t)
????local?mn?=?0
????for?k,?v?in?pairs(t)?do
????????if?mn?<?k?then
????????????mn?=?k
????????end
????end
????return?mn
end
tbl?=?{[1]?=?"a",?[2]?=?"b",?[3]?=?"c",?[26]?=?"z"}
print("tbl?長度?",?#tbl)
print("tbl?最大值?",?table_maxn(tbl))
~~~
~~~
執行以上代碼輸出結果為:
~~~
~~~
tbl?長度??3
tbl?最大值?????26
~~~
~~~
- Lua 簡介
- Lua 環境安裝
- Lua 數據類型
- Lua 變量
- Lua 循環
- Lua while 循環
- Lua for 循環
- Lua repeat...until 循環
- Lua 循環嵌套
- Lua break 語句
- Lua 流程控制
- Lua if 語句
- Lua if...else 語句
- Lua if 嵌套語句
- Lua 函數
- Lua 運算符
- Lua 字符串
- Lua 數組
- Lua 迭代器
- Lua table(表)
- Lua 模塊與包
- Lua 元表(Metatable)
- Lua 協同程序(coroutine)
- Lua 文件 I/O
- Lua 錯誤處理
- Lua 調試(Debug)
- Lua 垃圾回收
- Lua 面向對象
- Lua 數據庫訪問
- CoverPage