字典由於其獨特的儲存資料方式,我們訪問乙個字典可能會有不同的遍歷順序,當我們遊戲中希望同乙個字典,在不同手機上都有相同的訪問順序的時候,怎麼辦呢,我們可以重寫字典的遍歷方法pairs
local rawpairs = pairs
-------------------------------------------
-- 可以按指定順序遍歷的map迭代器
-- @param tbl 要迭代的表
-- @param func 比較函式
-- @example
-- for k,v in pairs(tbl,defaultcomp) do print(k,v) end
function
pairs
(tbl, func)
if func == nil
then
return rawpairs(tbl)
end-- 為tbl建立乙個對key排序的陣列
-- 自己實現插入排序,table.sort遇到nil時會失效
local ary = {}
local lastused = 0
for key --[[, val--]]
in rawpairs(tbl) do
if (lastused == 0) then
ary[1] = key
else
local done = false
for j=1,lastused do
-- 進行插入排序
if (func(key, ary[j]) == true) then
arrayinsert( ary, key, j )
done = true
break
endend
if (done == false) then
ary[lastused + 1] = key
endend lastused = lastused + 1
end-- 定義並返回迭代器
local i = 0
local iter = function
() i = i + 1
if ary[i] == nil
then
return
nilelse
return ary[i], tbl[ary[i]]
endendreturn iter
end
下面來例項使用一下新pairs
for k,v in
pairs(table_name, function
(op1,op2)
return op1 > op2 end) do
-- body...
end
--------------------------------
-- 通用比較器(comparator)
-- @return 對比結果
function
defaultcomp
( op1, op2 )
local type1, type2 = type(op1), type(op2)
local num1, num2 = tonumber(op1), tonumber(op2)
if ( num1 ~= nil) and (num2 ~= nil) then
return num1 < num2
elseif type1 ~= type2 then
return type1 < type2
elseif type1 == "string"
then
return op1 < op2
elseif type1 == "boolean"
then
return op1
-- 以上處理: number, string, boolean
else
-- 處理剩下的: function, table, thread, userdata
return
tostring(op1) < tostring(op2) -- tostring後比較字串
endend
使用方法
for k,v in
pairs(table_name, defaultcomp) do
-- body...
end
當大家遇到lua給的方法不夠使用的時候,大家可以自定義哦。 Lua之ipairs與pairs詳解
ipairs與pairs詳解 在說pairs與ipairs之前,先說lua中table的資料結構 1.由乙個 雜湊表與乙個 陣列構成,當插入乙個元素時,如果元素是鍵值對,則將其放入雜湊表中,如果是值則放入陣列中。2.hash表上會有衝突,通過乙個鍊錶的形式組織衝突的元素。接下來看一下ipairs與p...
lua 中pairs 和 ipairs差別
ipairs 和pairs在lua中都是遍歷tbale的函式可是兩者有差別 1.pairs遍歷table中的全部的key vale 而ipairs會依據key的數值從1開始加1遞增遍歷相應的table i 值 pairs能夠遍歷表中全部的key,而且除了迭代器本身以及遍歷表本身還能夠返回nil 可是...
LUA中ipairs和pairs的區別
在lua中,table的遍歷可以通過ipairs或pairs來完成,但是兩者的用法並非完全一樣的。ipairs只遍歷索引為數字的key value對,從下標1開始遞增 而pairs則會無序遍歷table中所有元素,字串索引 數字索引 函式等。因此,如果乙個table是乙個純陣列,那麼兩者遍歷的結果是...