Lua テーブル(配列・連想配列)のサンプル

目次

Luaのテーブル(配列・連想配列)の基本

テーブルの基本(配列風)

テーブル(配列風)を操作するサンプル

for文でのループ / ipairs(配列用ループ) / 要素の値を変更 /
要素の追加 / 要素の削除 / ソートする

連想配列(キー付きテーブル)

二次元配列(配列の中に配列)

確認環境:Lua 5.4

Luaのテーブル(配列・連想配列)の基本

Luaではtable(テーブル)が唯一の複合データ構造であり、配列・連想配列・オブジェクト的な用途すべてに使われます。

本記事では、特に配列風テーブルを中心に、実務で使える形で解説します。

テーブルの基本(配列風)

Luaのテーブルは {} 波括弧(なみかっこ)で作成します。

local tbl = {"red", "yellow", "blue"}

 

内部的には以下と同じ意味です。

local tbl = {
    [1] = "red",
    [2] = "yellow",
    [3] = "blue"
}

最初の添字は1から始まります。
このように 1から連続した整数キー を持つテーブルは、配列風テーブルとして扱われます。

 

要素へのアクセス

print(tbl[1]) -- red
print(tbl[2]) -- yellow
print(tbl[3]) -- blue

Luaの配列は1始まりです(0ではない点に注意)。

 

要素数の取得

print(#tbl) -- 3

要素数はシャープ(#)を指定します。

※注意※

#tblは、長さを返しますが、これは厳密な要素数ではありません。

安全に使える条件は、1から連続した整数キーのみ(途中にnilがない)です。

以下の場合は、期待どおりにはなりません。

local t = { "a", "b", nil, "d" }
print(#t)  -- 期待通りにならない

テーブル(配列風)を操作するサンプル

for文でのループ

local tbl = {"red","yellow","blue"}

for i = 1 , #tbl do
	print(tbl[i]) -- red yellow blue
end

 

ipairs(配列用ループ)

local tbl = {"red", "yellow", "blue"}

for i, v in ipairs(tbl) do
    print(i, v) -- 1 red 2 yellow 3 blue
end

1から順に走査します。
最初のnilに当たると終了します。

 

要素の値を変更

local tbl = {"red","yellow","blue"}
tbl[2] = "orange"

print(tbl[1]) -- red
print(tbl[2]) -- orange
print(tbl[3]) -- blue

値の変更は、添字を指定して値を代入します。

 

要素の追加

local tbl = {"red","yellow","blue"}
table.insert(tbl, "orange")

print(tbl[1]) -- red
print(tbl[2]) -- yellow
print(tbl[3]) -- blue
print(tbl[4]) -- orange

table.insertは、末尾に値を追加します。

位置指定も可能です。その場合後ろの要素は自動でずれます。

table.insert(tbl, 2, "green")  -- 2番目に挿入

 

要素の削除

local tbl = {"red","yellow","blue"}
table.remove(tbl)

print(tbl[1]) -- red
print(tbl[2]) -- yellow
print(tbl[3]) -- nil

removeは、末尾の値を削除します。

位置指定も可能です。その場合後ろが詰まります。

table.remove(tbl, 2)

 

ソートする

local tbl1 = {100,2,99}
table.sort(tbl1)

print(tbl1[1]) -- 2
print(tbl1[2]) -- 99
print(tbl1[3]) -- 100

local tbl2 = {"da","abb","pccc"}
table.sort(tbl2)

print(tbl2[1]) -- abb
print(tbl2[2]) -- da
print(tbl2[3]) -- pccc

sortは、昇順で並び替えます。

以下は、降順のソートです。

local tbl1 = {100, 2, 99}
table.sort(tbl1, function(a, b)
    return a > b
end)

print(tbl1[1]) -- 100
print(tbl1[2]) -- 99
print(tbl1[3]) -- 2

英字のソートは実質的に文字コード(ASCII)順で比較されます。

そのため、大文字(A–Z:65–90)は小文字(a–z:97–122)より前に並びます。
つまりZ<aとなる点に注意が必要です。

日本語(マルチバイト文字)はバイト順で比較されるため、五十音順にはなりません。

 

連想配列(キー付きテーブル)

local tbl = {c1="red",c2="yellow",c3="blue"}

print(tbl["c1"]) -- red
print(tbl["c2"]) -- yellow
print(tbl["c3"]) -- blue

tbl["c4"] = "orange"

print(tbl["c4"]) -- orange

1行目のキー(c1,c2,c3)にはダブルコーテーション(")がつきませんが
3行目以降のキーの指定には、ダブルコーテーションが必要です。

 

pairs(連想配列用の全要素ループ)

local tbl = {
    c1 = "red",
    c2 = "yellow",
    c3 = "blue"
}

for k, v in pairs(tbl) do
    print(k, v) -- c1 red c2 yellow c3 blue
end

pairsの順序は保証されません(結果の表示する順番が変わる場合があります)。

二次元配列(配列の中に配列)

local tbl = {{"red", "yellow"}, {"blue", "green"}}

print(tbl[1][1]) -- red

for i, row in ipairs(tbl) do
    for j, v in ipairs(row) do
        print(i, j, v) -- 1 1 red 1 2 yellow 2 1 blue 2 2 green
    end
end

関連の記事

Lua if文のサンプル
Lua for文 処理を繰り返すサンプル(break/continue)
Lua while文のサンプル(break/continue)

△上に戻る