Luaライブラリ 要注意点 ~テーブルライブラリ~†
テーブル文字列連結†
table.concat (table [, sep [, i [, j]]])†
table[i]..sep..table[i+1] ... sep..table[j] を返す。
sep のデフォルト値は空文字列で、 i のデフォルト値は1、 j のデフォルト値はテーブルの長さである。
i が j よりも大きい場合は空文字列を返す
math.randomseed(os.time())
t = {1,2,3}
print(table.concat(t) --> 123
print(table.concat(t,":")) --> 1:2:3
print(table.concat(t,"/",1,2))-->1/2
table.insert(tbl, pos, value)†
tbl … テーブル型
pos … 数値型(FIXNUM)
value … 任意の型
テーブルを配列として扱う関数です。
''値valueを持つ要素を、テーブルtblのpos番目に挿入します。
pos番目以降の要素は一つずつ後ろにずらされます。
posを省略したときには、要素はテーブルの最後に追加されます。''
table.insertは戻り値を何も返しません。
t = { "A", "B" }
table.insert(t, 2, "C") -- t = { "A", "C", "B" }
table.insert(t, "D") -- t = { "A", "C", "B", "D" }
非常に高いパフォーマンスが必要な時には、
t[#t+1] = value
のような記述の方がはるかに速い。
table.remove(tbl, pos)†
tbl … テーブル型
pos … 数値型(FIXNUM)
テーブルを配列として扱う関数です。
''テーブルtblからpos番目の要素を削除し、その後ろの要素を一つずつ前に詰めます。
posを省略したときには、最後の要素を削除します。''
table.removeは戻り値を何も返しません。
t = { "A", "B", "C", "D" }
table.remove(t, 2) -- t = { "A", "C", "D" }
table.remove(t) -- t = { "A", "C" }
ソート†
table.sort(table, comp)†
tbl … テーブル型
comp … 関数型
テーブルを配列として扱う関数です。
テーブルtblをソートします。
だいたい他の言語と使い方同じ。
ソートの対象となるのは、tbl[1]からtbl[n](ただし、n = #tbl)です。
compは、ソートの際の大小比較に用いる関数であり、tblの要素の値を2つ引数にとり、
最初の引数が2番目の引数より小さかったらtrue、そうでなければfalseを返さなければなりません。
compが省略された場合は、通常の比較演算子である<に相当する関数が使用されます。
ソートのアルゴリズムは安定ではありません。
すなわち、値が等しいとみなせる要素が複数あったときに、ソートの前後でそれらの順序は変わっているかもしれません。
table.sortは戻り値を何も返しません。
t = { 2, 4, 3, 1 }
table.sort(t, function(a,b) return a<b end) -- t = { 1, 2, 3, 4 }
for i, v in ipairs(t) do
print(i, v)
end
文字列の大文字・小文字を無視したソート†
tbl = {"ABC", "Ebg", "DEF", "zab"}
table.sort(
tbl,
function (a, b) return a:lower() < b:lower() end
)
ハッシュタイプをソートする†
lines = {
luaH_set = 10,
luaH_get = 24,
luaH_present = 48,
}
a = {}
for n in pairs(lines) do a[#a + 1] = n end -- キーだけで配列化
table.sort(a) -- キーだけでソート
for i, n in ipairs(a) do print(n) end -- その順番でlinesテーブル吐き出し
ハッシュタイプをソートする(イテレータ変数編)†
function pairsByKeys(t, f)
local a = {}
for n in pairs(t) do a[#a+1] = n end
table.sort(a, f)
local i = 0 -- イテレータ変数
return function () -- イテレータ変数
i = i + 1
return a[i], t[a[i]]
end
--ソート表示
for k, v in pairsByKeys(lines) do
print(k, v)
end
--ソートアルゴ変更
for k, v in pairsByKeys(lines, function(a,b) return b<a end) do
print(k, v)
end
end