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 のガベージコレクションが対応するメモリをクリアします。

以下の例は上記の説明を実演しています:

実例

-- 簡単な table
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 操作でよく使われるメソッドを示します:

番号メソッド & 用途
1table.concat (table [, sep [, start [, end]]]):

concat は concatenate(連鎖、連結)の略です。table.concat() 関数は、引数で指定された table の配列部分の start から end までのすべての要素を、指定された区切り文字(sep)で区切って出力します。

2table.insert (table, [pos,] value):

table の配列部分の指定位置(pos)に値 value の要素を挿入します。pos パラメータはオプションで、デフォルトは配列部分の末尾です。

3table.maxn (table)

指定された table 内のすべての正のキー値の中で最大のキー値を返します。正のキー値を持つ要素が存在しない場合は 0 を返します。Lua 5.2 以降、このメソッドは存在しなくなったため、この記事ではカスタム関数を使用して実装しています。)

4table.remove (table [, pos])

table の配列部分の pos 位置にある要素を返します。その後の要素は前に移動します。pos パラメータはオプションで、デフォルトは table の長さ、つまり最後の要素から削除します。

5table.sort (table [, comp])

指定された table を昇順にソートします。

次に、これらのメソッドの例を見てみましょう。

Table 連結

concat() を使用して、リスト内の要素を連結した文字列を出力できます:

実例

fruits = {"banana","orange","apple"}
-- table を連結した文字列を返す
print("連結後の文字列 ",table.concat(fruits))

-- 連結文字を指定
print("連結後の文字列 ",table.concat(fruits,", "))

-- インデックスを指定して table を連結
print("連結後の文字列 ",table.concat(fruits,", ", 2,3))

上記コードを実行すると、出力結果は次のとおりです:

连接后的字符串     bananaorangeapple
连接后的字符串     banana, orange, apple
连接后的字符串     orange, apple

挿入と削除

以下の例は、table の挿入と削除操作を示しています:

実例

fruits = {"banana","orange","apple"}

-- 末尾に挿入
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() メソッドの使用方法を示しています:

実例

fruits = {"banana","orange","apple","grapes"}
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 内の最大値を取得する方法を示しています:

実例

function table_maxn(t)
  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
その他の拡張