現在有一個需求: 針對一個答題統計, 需要統計近5次的錯誤次數. 思路是, 使用數表去儲存這5次錯誤次數, 然後統計數表 現在有一個5個元素的數表 error_last_5_times = {1, 0, 1, 0 ,1} 其中1表示正確, 0表示錯誤 這裡有兩種統計方法: -- 方法1: 使用迭代數 ...
現在有一個需求: 針對一個答題統計, 需要統計近5次的錯誤次數.
思路是, 使用數表去儲存這5次錯誤次數, 然後統計數表
現在有一個5個元素的數表 error_last_5_times = {1, 0, 1, 0 ,1}
其中1表示正確, 0表示錯誤
這裡有兩種統計方法:
-- 方法1: 使用迭代數表來統計
error_last_5_times = {1, 0, 1, 0 ,1}
total1 = function (error_last_5_times)
local wrong_times = 0
for i = 1, 5 do
if error_last_5_times[i] == 0 then
wrong_times = wrong_times + 1
end
end
return wrong_times
end
-- 方法2: 使用字元串統計
error_last_5_times = {1, 0, 1, 0 ,1}
total2 = function (error_last_5_times)
local _, wrong_times
-- 將數表轉化為字元串, 統計替換字元串中"0"的次數
_, wrong_times = table.concat(error_last_5_times, ""):gsub("0", "")
return wrong_times
end
通常而言, total1
函數會更快一些, 但是可讀性上不是很好.
total2
函數因為使用到了兩個內置函數( table.concat
和 string.gsub
)去處理, 可讀性上會更高, 但是效率會稍微差上一些, 這一點點出來之後稍微回看一下代碼就可以比較清楚的理解了.
還有一個新的需求: 因為是一個答題模擬, 所以不斷地有新的數據傳入, 需要將新數據答題的正確或者錯誤, 寫入 error_last_5_times
這個表中, 但是需要統計的還是近5次的錯誤次數.
也就是, 需要一個添加新數據的函數.
一樣的, 我們看兩個函數:
-- 方法1: 使用迴圈緩存結構去添加新數據
-- 在`error_last_5_times`表中添加一個鍵`index`, 用來緩存迴圈數
error_last_5_times = {1, 0, 1, 0 ,1 , index = 0}
add1 = function (error_last_5_times, value)
-- 使用餘數進行限制迴圈
error_last_5_times.index = (error_last_5_times.index % 5) + 1
error_last_5_times[error_last_5_times.index] = value
return error_last_5_times
end
在上面這個方法中, 使用了一個迴圈緩存結構去添加新數據, 即 error_last_5_times.index
是一個從1~5逐步迴圈的數, 當超過6的數出現時, 會回滾到前面的索引並覆蓋原來的數據, 這使得添加新數據並不需要很高的運算.
-- 方法2: 使用內置表操作函數去添加新數據
error_last_5_times = {1, 0, 1, 0 ,1}
add2 = function (error_last_5_times, value)
table.insert(error_last_5_times, 1, value)
table.remove(error_last_5_times)
return error_last_5_times
end
在這一個方法中, 每次添加新數據, 會使用 table.inset
在 error_last_5_times
的第一個元素添加新的正確率數據, 並使用 table.remove
刪除最後一個數據, 由於Lua中移動表的效率較低, 所以很明顯, 這也是一個增加可讀性以減少程式效率的方法.