ソート関数
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 件のコメント:
コメントを投稿