Lua入門 - 配列とテーブル

Luaのテーブル型

ある種のデータをまとめて扱いたいことがあります。こういう時に、ある型の変数を束ねた配列(Array)と呼ばれるものか、またはそれに類するものを使います。
ところで、LuaにはいわゆるC言語などにおける配列型のようなものは存在しません。代わりに、テーブル型がLuaの基本型として用意されています。

Luaのテーブルは連想配列(Hash)と呼ばれるもので、キー(key)と(value)のペアを束ねたものです。空のテーブル変数の宣言は次のように行います。

構文

(アクセス修飾子) テーブル名 = { }

また、テーブルの宣言と同時にテーブルの要素を指定することもできます。

構文

(アクセス修飾子) テーブル名 = {
    キー名 = 値,
    キー名 = 値    --入れる数だけ繰り返す
}

なお、テーブルには、nilを除くすべての型の値を代入できます。

テーブルにある要素を変更する場合は、添え字演算子[ ]を使用して次のように行います。
また、テーブルに新しく要素を追加する場合も同じ方法で行います。Luaのテーブルは動的に要素数を確保するので、テーブルの再定義などの面倒な操作は不要です。

構文

テーブル名[キー名] = 値

 

配列

さて、先ほどLuaには配列型はないと言いましたが、Luaのテーブルの添え字(キー)に1から始まる連番の数字を指定することで、配列のように使用することができます。
このようなテーブルは、Luaの内部挙動上もC言語等にみられる一般的な配列と同様なものとして扱われ、実質的に配列型となります。以後、このWikiではこれを単に配列と呼びます。
なお、一般的な配列とは違い、添え字は1から始まることに注意してください。

次の例では空の配列を定義し、そのあと3つの要素を追加します。

-- 配列のサンプル1
myTable = { }      -- 空の配列
myTable[1] = 10    -- 添え字は1から。Luaの配列は動的配列なのでこれで問題ない。
myTable[2] = 20
myTable[3] = myTable[1] + myTable[2]    -- 式を代入してもよい。実際に代入される値はこの式の計算結果。

また、配列に対しては、長さ演算子(#)を用いて配列の要素数を取得することができます。
次の例では3つの要素を持った配列を定義し、そのあと4つ目の要素を追加します。

-- 配列のサンプル1
myTable = {10, 20, 30}      -- 要素数3の配列。配列の初期化においてはキー名を省略する。

myTable[#myTable + 1] = 40    --#myTable でこの時点の配列の長さ(3)を取得できる。

 

連想配列

さて、Luaのテーブルはキーと値のペアを束ねた連想配列だと言いました。連想配列を使用する場合も、配列と似た方法で行います。

次の例は空の連想配列を定義し、そのあと3つの要素を追加します。

myTable = { }
myTable["Name"] = "hoge"
myTable["Sex"] = "male"
myTable["Age"] = 25

連想配列のキーに文字列を指定する場合、添え字演算子の中ではダブルクォーテーションを忘れずにつけてください。これがない場合、文字列ではなく識別子として扱われます。
また、連想配列のメンバへのアクセスは、次のようにドット演算子(.)を使用しても行えます。この場合、ダブルクォーテーションは不要です。

myTable = { }
myTable.Name = "hoge"
myTable.Sex = "male"
myTable.Age = 25

次の例では連想配列の初期化時に値を代入します。

myTable = {
    Name = "hoge",
    Sex = "male",
    Age = 25
}

 

多次元配列

配列の要素には配列を指定することができます。これを利用して多次元配列ジャグ配列(配列の配列)を作ることができます。

次の例では2次元配列hogeを定義します。

hoge = {{0, 1}, {2, 3}}

次の例では2つの2次元配列を2 x 2の正方行列A, Bに見立てて、A + BとA x Bを行い、その結果を表示します。

A = {{1, 2}, {4, 3}}
B = {{2, 5}, {4, 1}}

C = {{}, {}}    -- 空の配列を2つ要素に持たせる。 C = {{0, 0}, {0, 0}}のように明示的に初期化してもよい。
C[1][1] = A[1][1] + B[1][1]
C[1][2] = A[1][2] + B[1][2]
C[2][1] = A[2][1] + B[2][1]
C[2][2] = A[2][2] + B[2][2]

D = {{}, {}}
D[1][1] = A[1][1] * B[1][1] + A[1][2] * B[2][1]
D[1][2] = A[1][1] * B[1][2] + A[1][2] * B[2][2]
D[2][1] = A[2][1] * B
[1][1] + A[2][2] * B[2][1]
D[2][2] = A[2][1] * B
[1][2] + A[2][2] * B[2][2]

print("A + B = \n"..
    C[1][1].." "..C[1][2].."\n"..
    C[2][1].." "..C[2][2].."\n\n"..
   "A x B = \n"..
    D[1][1].." "..D[1][2].."\n"..
    D[2][1].." "..D[2][2])


--[[ out:
A + B =
3 7
8 4

A x B =
10 7
20 23 ]]

 

配列操作

配列変数に対し、挿入や並び替えなどの操作を行うことができます。

  1. table.getn()関数

 配列の要素数を返します。

構文

number table.getn(table array)

注意:Luaは動的型付けのため変数は型情報を持ちませんが、関数の引数として渡すべき値および戻り値の型をわかりやすくするため、このWikiではあたかも変数が型付されているかのような表記を取っています。なお、便宜上、voidは戻り値を持たないことを、objectはすべての型を表すものとします。

次の例では、要素数3の配列hogeを定義し、その長さを表示します。

hoge = {10, 20, 30}
print(table.getn(hoge))    --out: 3

配列の長さは、長さ演算子を用いても取得できます。したがって、次の例も同じ結果(3)を出力します。 

hoge = {10, 20, 30}
print(#hoge)

連想配列に対して要素数を取得したい場合、次のようにイテレータを使用します(イテレータについては条件分岐と反復処理で説明)。

 hoge = {
    Name = "hoge",
    Sex = "male",
    Age = 25
}

local count = 0
for i, v 
in pairs(hoge) do
    count = count + 1

end

print(count)    --out: 3

 

  1. table.insert() 関数

指定した配列の指定した位置に指定した値を挿入します。位置を省略した場合、配列の末尾に要素を追加します。

構文

void table.insert(table array, [number position],object value)

次の例では、要素数3の配列hogeを定義し、3つの要素を追加します。1つ目は2番目に、2つ目は最後に、3つ目は最後から2番目に追加します。

hoge = {1, 2, 3}
table.insert(hoge, 2, 4)                -- hoge: {1, 4, 2, 3}
table.insert(hoge, "huga")              -- hoge: {1, 4, 2, 3, "huga"}
table.insert(hoge, #hoge - 1, false)    -- hoge: {1, 4, 2, 3, false, "huga"}

 

  1. table.remove() 関数

指定した配列の指定した位置の要素を削除します。位置を省略した場合、この配列の最後の要素を削除します。

構文

void table.remove(table array, [number position])

次の例では、要素数5の配列hogeを定義し、2番目と最後の要素を削除します。

hoge = {1, 2, 3, 4, 5}
table.remove(hoge, 2)    -- hoge: {1, 3, 4, 5}
table.remove(hoge)       -- hoge: {1, 3, 4}

 

  1. table.sort() 関数

指定した配列の要素同士を指定した比較方法で比較し、並び替えます。比較方法を省略した場合、標準の比較方法によって昇順に並び替えます。

構文

void table.sort(table array, [function comp])

次の例では、要素数5の配列hogeを定義し、標準の比較方法によってソートします。

hoge = {3, 5, 2, 4, 1}
void table.sort(hoge)    -- hoge: {1, 2, 3, 4, 5}

 

  1. table.concat() 関数

指定した区切り文字を使用して、指定した配列の指定範囲の要素を結合し、文字列として返します。
区切り文字を指定しない場合、空文字列が代わりに使用され、開始インデクスは指定されない場合1を、終了インデクスは指定されない場合#arrayを使用します。

構文

string table.sort(table array, [string separator], [number start], [number end])

次の例では、要素数10の配列hogeを定義し、区切り文字","を使用して3番目から7番目の要素を文字列にして表示します。

hoge = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55}
print(table.concat(hoge,",", 3, 7))    -- out: 2,3,5,8,13
 
最終更新:2016年11月29日 09:20