Lua 重寫pairs方法(讓字典訪問有序)

2021-08-13 15:31:30 字數 2290 閱讀 9393

字典由於其獨特的儲存資料方式,我們訪問乙個字典可能會有不同的遍歷順序,當我們遊戲中希望同乙個字典,在不同手機上都有相同的訪問順序的時候,怎麼辦呢,我們可以重寫字典的遍歷方法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是乙個純陣列,那麼兩者遍歷的結果是...