Lua table(表)
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>
<thead>
<tr>
<th style="text-align:left">序號</th>
<th style="text-align:left">方法 & 用途</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">1</td>
<td style="text-align:left">
<p><b>table.concat (table [, sep [, start [, end]]]):</b>
</p>
<p>concat是concatenate(連鎖, 連線)的縮寫. table.concat()函式列出引數中指定table的陣列部分從start位置到end位置的所有元素,
元素間以指定的分隔符(sep)隔開。</p>
</td>
</tr>
<tr>
<td style="text-align:left">2</td>
<td style="text-align:left">
<p><b>table.insert (table, [pos,] value):</b>
</p>
<p>在table的陣列部分指定位置(pos)插入值為value的一個元素. pos引數可選, 預設為陣列部分末尾.</p>
</td>
</tr>
<tr>
<td style="text-align:left">3</td>
<td style="text-align:left">
<p><b>table.maxn (table)</b>
</p>
<p>指定table中所有正數key值中最大的key值. 如果不存在key值為正數的元素, 則返回0。(<b>Lua5.2之後該方法已經不存在了,本文使用了自定義函式實現</b>)</p>
</td>
</tr>
<tr>
<td style="text-align:left">4</td>
<td style="text-align:left">
<p><b>table.remove (table [, pos])</b>
</p>
<p>返回table陣列部分位於pos位置的元素. 其後的元素會被前移. pos引數可選, 預設為table長度, 即從最後一個元素刪起。</p>
</td>
</tr>
<tr>
<td style="text-align:left">5</td>
<td style="text-align:left">
<p><b>table.sort (table [, comp])</b>
</p>
<p>對給定的table進行升序排序。</p>
</td>
</tr>
</tbody>
</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=nil;
for k, v in pairs(t) do
if(mn==nil) then
mn=v
end
if mn < v then
mn = v
end
end
return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
print("tbl 最大值:", table_maxn(tbl))
print("tbl 長度 ", #tbl)
執行以上程式碼輸出結果為:
tbl 最大值: 34
tbl 長度 3
注意:
當我們獲取 table 的長度的時候無論是使用 # 還是 table.getn 其都會在索引中斷的地方停止計數,而導致無法正確取得 table 的長度。
可以使用以下方法來代替:
function table_leng(t) local leng=0 for k, v in pairs(t) do leng=leng+1 end return leng; end
相關文章
- Lua Table 長度的計算
- Lua 列印table 實現型別python的repr用於table型別Python
- 使用自定義lua解析管理器呼叫lua指令碼中的table指令碼
- LUA元表和元方法
- SQLAlchemy Table(表)類方式 – Table類和Column類SQL
- 一文讀懂Lua元表
- table表頭固定問題
- elementUI table 自定義表頭UI
- layui將table轉化表單顯示(即table.render轉為表單展示)UI
- 透視表pivot_table和交叉表crosstabROS
- (一)Superset 1.3圖表篇——Table
- element table 表頭顯示 tooltip
- table/index/LOBINDEX遷移表空間Index
- 達夢列儲存表(HUGE Table)
- 【TABLE】Oracle表資訊收集指令碼Oracle指令碼
- (三、四)Superset 1.3圖表篇——透視表-Pivot Table
- MySQL InnoDB File-Per-Table表空間MySql
- Bootstrap select2 ,table, 清空表單formbootORM
- table表頭單元格斜線效果
- table表單製作個人簡歷
- table表頭分組程式碼例項
- vxe-form table 配置式表單的使用ORM
- vxe-form table 實現摺疊表單ORM
- 【TABLE】Oracle監控異常的表設計Oracle
- MyIsam 表 “ Incorrect key file for table 't_ '; try to repair it”AI
- 【Lua】VSCode 搭建 Lua 開發環境VSCode開發環境
- 《Lua-in-ConTeXt》09:學一點 LuaContext
- lua~IDEA中除錯lua指令碼Idea除錯指令碼
- Lua 特性
- Hello Lua
- vxe-form table 表單實現簡歷模板ORM
- vxe-form table 表單使用資料校驗ORM
- oracle表空間不足:ORA-01653: unable to extend tableOracle
- React table 表單裡的內容點選事件React事件
- ElementUI 中 table 表格自定義表頭 Tooltip 文字提示UI
- javascript: 帶分組資料的Table表頭排序JavaScript排序
- [20181203]drop table後如何獲得表結構.txt
- create table,show tables,describe table,DROP TABLE,ALTER TABLE ,怎麼使用?