目次
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)
