*Luaライブラリ 要注意点 ~テーブルライブラリ~ [#d3df91d8]

**テーブル文字列連結 [#q2936ef3]
~table.concat (table [, sep [, i [, j]]])~
**テーブル文字列連結 [#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
}}

**math.maxinteger [#j24f0579]
>~
''lua 5.3からはmath.maxinteger''が使える。こちらは安全なint範囲がわかるので使い道がある
**挿入 [#h4d15e34]
***table.insert(tbl, pos, value) [#k1b84ec4]
>tbl … テーブル型~
pos … 数値型(FIXNUM)~
value … 任意の型~

**math.random(m, n) [#gb80f8fc]
>~
m, n … 数値型(1~4294967295) 
m以上、n以下の範囲の擬似乱数を返します。擬似乱数の種はmath.randomseed関数で指定します。 
>>
引数が1つだけの場合は、1以上、第1引数以下の整数 
引数が1つも無い場合は、0以上、1以下の浮動少数
>テーブルを配列として扱う関数です。 ~
~
''値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){{
math.randomseed(os.time())
r = math.random(100)        -- r = 1~100
r = math.random(1000, 2000) -- r = 1000~2000
r = math.random()   -- r = 0.33323454
t = { "A", "B", "C", "D" }
table.remove(t, 2) -- t = { "A", "C", "D" }
table.remove(t) -- t = { "A", "C" } 
}}
''randomseedは種の設定。''~
''時間が変化することが期待できる場合は、os.time()を、1フレーム内で何度も処理する。''~
''時間の変化が期待できない場合は、なんらかの内部的カウンタなどを種とする。''~
この当たりは、他の言語と同じ。~

**ソート [#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

   --ソート表示
    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
}}


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS