Lua table(表)
table は Lua のデータ構造の一種で、配列や辞書などのさまざまなデータ型を作成するのに役立ちます。
Lua の table は連想配列を使用しており、任意の型の値を配列のインデックスとして使えます。ただし、その値は nil にできません。
Lua の table はサイズが固定されておらず、必要に応じて拡張できます。
Lua はモジュール、パッケージ、オブジェクトの問題も table によって解決しています。例えば、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 のガベージコレクションが対応するメモリをクリアします。
以下の例は上記の説明を実演しています:
実例
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("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 的元素是 修改前 alternatetable 索引为 1 的元素是 Lua alternatetable 索引为 wow 的元素是 修改前 mytable 索引为 wow 的元素是 修改后 alternatetable 是 nil mytable 索引为 wow 的元素是 修改后 mytable 是 nil
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 内のすべての正のキー値の中で最大のキー値を返します。正のキー値を持つ要素が存在しない場合は 0 を返します。Lua 5.2 以降、このメソッドは存在しなくなったため、この記事ではカスタム関数を使用して実装しています。) |
| 4 | table.remove (table [, pos]) table の配列部分の pos 位置にある要素を返します。その後の要素は前に移動します。pos パラメータはオプションで、デフォルトは table の長さ、つまり最後の要素から削除します。 |
| 5 | table.sort (table [, comp]) 指定された table を昇順にソートします。 |
次に、これらのメソッドの例を見てみましょう。
Table 連結
concat() を使用して、リスト内の要素を連結した文字列を出力できます:
実例
-- table を連結した文字列を返す
print("連結後の文字列 ",table.concat(fruits))
-- 連結文字を指定
print("連結後の文字列 ",table.concat(fruits,", "))
-- インデックスを指定して table を連結
print("連結後の文字列 ",table.concat(fruits,", ", 2,3))
上記コードを実行すると、出力結果は次のとおりです:
连接后的字符串 bananaorangeapple 连接后的字符串 banana, orange, apple 连接后的字符串 orange, apple
挿入と削除
以下の例は、table の挿入と削除操作を示しています:
実例
-- 末尾に挿入
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 ソート
以下の例は、Table をソートするための sort() メソッドの使用方法を示しています:
実例
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 は Lua 5.2 以降存在しなくなったため、table_maxn メソッドを定義して実装しています。
以下の例は、table 内の最大値を取得する方法を示しています:
実例
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