ソート関数
function sort(array, compare)
for i = 1, #array do
for j = #array, i + 1, -1 do
if compare(array[i], array[j]) < 0 then
array[i], array[j] = array[j], array[i]
end
end
end
end
サンプル
function color_to_luminance(color)
return(0.299 * (color.R or 0) + 0.587 * (color.G or 0) + 0.114 * (color.B or 0))
end
do
local numbers = {
10, 5, 8, 3,
}
print("---")
for i = 1, #numbers do
print(numbers[i])
end
sort(numbers, function(a, b) return(b - a) end)
print("---")
for i = 1, #numbers do
print(numbers[i])
end
local colors = {
{ R = 255, G = 255, B = 255 },
{ R = 255 },
{ G = 255 },
{ B = 255 },
{ },
}
print("---")
for i = 1, #colors do
print((colors[i].R or 0) .. " " .. (colors[i].G or 0) .. " " .. (colors[i].B or 0))
end
sort(colors, function(a, b) return(color_to_luminance(b) - color_to_luminance(a)) end)
print("---")
for i = 1, #colors do
print((colors[i].R or 0) .. " " .. (colors[i].G or 0) .. " " .. (colors[i].B or 0))
end
end
結果
10 5 8 3 --- 3 5 8 10 --- 255 255 255 255 0 0 0 255 0 0 0 255 0 0 0 --- 0 0 0 0 0 255 255 0 0 0 255 0 255 255 255
バブルソートなのであまり早くない。今回は要素数200未満を1回通せば終わるので、たぶん問題ない。
第2引数に比較関数を渡さないといけない。このあたりは使い方次第なので各自工夫してください。
Luaはswapが簡単にできたり、デフォルト値をorで簡単に設定できたりするので便利。インクリメントとかデクリメントとか演算代入が使えないのは不便だけど。^で累乗できたりするのは結構便利。math.powとか使わなくても済むので、数式的に見やすい。なれないとちょっと違和感あるけど。
あとCらいくに戻った時にセミコロンを忘れるのが欠点らしい欠点か。
0 件のコメント:
コメントを投稿