English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lua table(テーブル)

テーブルはLuaのデータ構造の1つで、異なるデータ型(配列、辞書など)を作成するのを助けます。

Luaのテーブルは関連型配列を使用しており、任意のデータ型の値を使用して配列のインデックスとして使用できますが、この値はnilではありません。

Luaのテーブルは固定サイズではありません。必要に応じて自分で拡張できます。

Luaはまた、テーブルを使用してモジュール(module)、パッケージ(package)およびオブジェクト(Object)を解決します。 例えばstring.formatは"format"を使用してテーブルstringをインデックスするように表示されます。

table(テーブル)の構築

コンストラクタはテーブルの作成と初期化を表す式です。テーブルはLua特有の強力な機能です。最もシンプルなコンストラクタは{}で、空のテーブルを作成するために使用されます。配列を直接初期化することができます:

-- テーブルの初期化
mytable = {}
-- 指定値
mytable[1}
-- 参照を削除
mytable = nil
-- Luaのゴミ収集がメモリを解放します

table aに要素を設定し、aをbに割り当てると、aとbは同じメモリを指します。aがnilに設定された場合 、bもtableの要素にアクセスできます。aに指定された変数がない場合、Luaのゴミ収集メカニズムが対応するメモリをクリアします。

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

-- シンプルなtable
mytable = {}
print("mytableの型は", type(mytable))
mytable[1}
mytable["wow"] = "変更前"
print("mytableのindexが 1 の要素は"", mytable[1])
print("mytableのindexがwowの要素は", mytable["wow"])
-- alternatetableとmytableは同じtableを指しています
alternatetable = mytable
print("alternatetableのindexが 1 の要素は"", alternatetable[1])
print("mytableのindexがwowの要素は", alternatetable["wow"])
alternatetable["wow"] = "変更後"
print("mytableのindexがwowの要素は", mytable["wow"])
-- 変数の解放
alternatetable = nil
print("alternatetableは", alternatetable)
-- mytableはまだアクセスできます
print("mytableのindexがwowの要素は", mytable["wow"])
mytable = nil
print("mytableは", mytable)

以上のコードの実行結果は以下の通りです:

mytableの型はnilです。table
mytableのindexが 1 の要素はnilです。Lua
mytableのindexがwowの要素はnilです。変更前
alternatetableのindexが 1 の要素はnilです。Lua
mytableのindexがwowの要素はnilです。変更前
mytableのindexがwowの要素はnilです。変更後
alternatetableはnilです
mytableのindexがwowの要素はnilです。変更後
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中のすべての正のkey値の最大のkey値を指定します。正のkey値を持つ要素が存在しない場合、0を返します。(Lua5.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 並び替え

以下の例では、sort()メソッドの使用を示しています。これはTableをソートするために使用されます:

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の最大値

Luaでのtable.maxn5.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