Lua-テーブル
前書き
テーブルは、配列や辞書などのさまざまなタイプを作成するのに役立つ、Luaで利用可能な唯一のデータ構造です。Luaは連想配列を使用しており、数値だけでなくnil以外の文字列でもインデックスを付けることができます。テーブルには固定サイズはなく、必要に応じて拡張できます。
Luaは、パッケージの表現を含むすべての表現でテーブルを使用します。string.formatメソッドにアクセスすると、文字列パッケージで使用可能なformat関数にアクセスしていることを意味します。
表現と使用法
テーブルはオブジェクトと呼ばれ、値でも変数でもありません。Luaはコンストラクター式{}を使用して空のテーブルを作成します。テーブルの参照を保持する変数とテーブル自体の間に固定の関係がないことを知っておく必要があります。
--sample table initialization
mytable = {}
--simple table value assignment
mytable[1]= "Lua"
--removing reference
mytable = nil
-- lua garbage collection will take care of releasing memory
テーブルがあるとき a 要素のセットを使用して、それをに割り当てる場合 b、 どちらも a そして b同じメモリを参照してください。bに個別のメモリが個別に割り当てられることはありません。aがnilに設定されている場合でも、bはテーブルにアクセスできます。テーブルへの参照がない場合、Luaのガベージコレクションがクリーンアッププロセスを処理して、これらの参照されていないメモリを再利用できるようにします。
上記のテーブルの機能を説明するための例を以下に示します。
-- Simple empty table
mytable = {}
print("Type of mytable is ",type(mytable))
mytable[1]= "Lua"
mytable["wow"] = "Tutorial"
print("mytable Element at index 1 is ", mytable[1])
print("mytable Element at index wow is ", mytable["wow"])
-- alternatetable and mytable refers to same table
alternatetable = mytable
print("alternatetable Element at index 1 is ", alternatetable[1])
print("alternatetable Element at index wow is ", alternatetable["wow"])
alternatetable["wow"] = "I changed it"
print("mytable Element at index wow is ", mytable["wow"])
-- only variable released and and not table
alternatetable = nil
print("alternatetable is ", alternatetable)
-- mytable is still accessible
print("mytable Element at index wow is ", mytable["wow"])
mytable = nil
print("mytable is ", mytable)
上記のプログラムを実行すると、次の出力が得られます-
Type of mytable is table
mytable Element at index 1 is Lua
mytable Element at index wow is Tutorial
alternatetable Element at index 1 is Lua
alternatetable Element at index wow is Tutorial
mytable Element at index wow is I changed it
alternatetable is nil
mytable Element at index wow is I changed it
mytable is nil
テーブル操作
テーブル操作用の組み込み関数があり、それらを次の表に示します。
シニア番号 | 方法と目的 |
---|---|
1 | table.concat (table [, sep [, i [, j]]]) 指定されたパラメータに基づいて、テーブル内の文字列を連結します。詳細については、例を参照してください。 |
2 | table.insert (table, [pos,] value) テーブルの指定した位置に値を挿入します。 |
3 | table.maxn (table) 最大の数値インデックスを返します。 |
4 | table.remove (table [, pos]) テーブルから値を削除します。 |
5 | table.sort (table [, comp]) オプションのコンパレータ引数に基づいてテーブルをソートします。 |
上記の関数のサンプルをいくつか見てみましょう。
テーブルの連結
以下に示すように、concat関数を使用して2つのテーブルを連結できます。
fruits = {"banana","orange","apple"}
-- returns concatenated string of table
print("Concatenated string ",table.concat(fruits))
--concatenate with a character
print("Concatenated string ",table.concat(fruits,", "))
--concatenate fruits based on index
print("Concatenated string ",table.concat(fruits,", ", 2,3))
上記のプログラムを実行すると、次の出力が得られます-
Concatenated string bananaorangeapple
Concatenated string banana, orange, apple
Concatenated string orange, apple
挿入と削除
テーブル内のアイテムの挿入と削除は、テーブル操作で最も一般的です。以下に説明します。
fruits = {"banana","orange","apple"}
-- insert a fruit at the end
table.insert(fruits,"mango")
print("Fruit at index 4 is ",fruits[4])
--insert fruit at index 2
table.insert(fruits,2,"grapes")
print("Fruit at index 2 is ",fruits[2])
print("The maximum elements in table is",table.maxn(fruits))
print("The last element is",fruits[5])
table.remove(fruits)
print("The previous last element is",fruits[5])
上記のプログラムを実行すると、次の出力が得られます-
Fruit at index 4 is mango
Fruit at index 2 is grapes
The maximum elements in table is 5
The last element is mango
The previous last element is nil
テーブルの並べ替え
多くの場合、テーブルを特定の順序で並べ替える必要があります。並べ替え関数は、テーブル内の要素をアルファベット順に並べ替えます。このサンプルを以下に示します。
fruits = {"banana","orange","apple","grapes"}
for k,v in ipairs(fruits) do
print(k,v)
end
table.sort(fruits)
print("sorted table")
for k,v in ipairs(fruits) do
print(k,v)
end
上記のプログラムを実行すると、次の出力が得られます-
1 banana
2 orange
3 apple
4 grapes
sorted table
1 apple
2 banana
3 grapes
4 orange