*Luaライブラリ 要注意点 ~テーブルライブラリ~ [#d3df91d8] **テーブル文字列連結 [#n5381312] ***table.concat (table [, sep [, i [, j]]]) [#b0374a95] >table[i]..sep..table[i+1] ... sep..table[j] を返す。~ sep のデフォルト値は空文字列で、 i のデフォルト値は1、 j のデフォルト値はテーブルの長さである。~ i が j よりも大きい場合は空文字列を返す #sh(lua){{ 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 }} **挿入 [#h4d15e34] ***table.insert(tbl, pos, value) [#k1b84ec4] >tbl … テーブル型~ pos … 数値型(FIXNUM)~ value … 任意の型~ >テーブルを配列として扱う関数です。 ~ ~ ''値valueを持つ要素を、テーブルtblのpos番目に挿入します。~ pos番目以降の要素は一つずつ後ろにずらされます。~ posを省略したときには、要素はテーブルの最後に追加されます。'' ~ ~ table.insertは戻り値を何も返しません。 ~ #sh(lua){{ t = { "A", "B" } table.insert(t, 2, "C") -- t = { "A", "C", "B" } table.insert(t, "D") -- t = { "A", "C", "B", "D" } }} 非常に高いパフォーマンスが必要な時には、~ #sh(lua){{ t[#t+1] = value }} のような記述の方がはるかに速い。~ **削除 [#sbaac104] ***table.remove(tbl, pos) [#jce42074] >tbl … テーブル型~ pos … 数値型(FIXNUM)~ >テーブルを配列として扱う関数です。 ~ ~ ''テーブルtblからpos番目の要素を削除し、その後ろの要素を一つずつ前に詰めます。 posを省略したときには、最後の要素を削除します。''~ ~ table.removeは戻り値を何も返しません。 ~ ~ #sh(lua){{ t = { "A", "B", "C", "D" } table.remove(t, 2) -- t = { "A", "C", "D" } table.remove(t) -- t = { "A", "C" } }} **ソート [#sbaac104] ***table.sort(table, comp) [#e99ec0a8] >tbl … テーブル型~ comp … 関数型 >テーブルを配列として扱う関数です。 ~ ~ テーブルtblをソートします。~ だいたい他の言語と使い方同じ。~ ~ ソートの対象となるのは、tbl[1]からtbl[n](ただし、n = #tbl)です。~ compは、ソートの際の大小比較に用いる関数であり、tblの要素の値を2つ引数にとり、~ 最初の引数が2番目の引数より小さかったらtrue、そうでなければfalseを返さなければなりません。~ compが省略された場合は、通常の比較演算子である<に相当する関数が使用されます。 ~ ~ ''ソートのアルゴリズムは安定ではありません。''~ ''すなわち、値が等しいとみなせる要素が複数あったときに、ソートの前後でそれらの順序は変わっているかもしれません。 ''~ ~ table.sortは戻り値を何も返しません。 ~ #sh(lua){{ 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 }} **文字列の大文字・小文字を無視したソート [#u2510bf3] > #sh(lua){{ tbl = {"ABC", "Ebg", "DEF", "zab"} table.sort( tbl, function (a, b) return a:lower() < b:lower() end ) }} **ハッシュタイプをソートする [#sad12e5e] > #sh(lua){{ 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テーブル吐き出し }} **ハッシュタイプをソートする(イテレータ変数編) [#t3f28c02] > #sh(lua){{ 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 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 }}