Lua -- 重写pairs方法(让字典访问有序)
2017-12-15 21:12
676 查看
字典由于其独特的存储数据方式,我们访问一个字典可能会有不同的遍历顺序,当我们游戏中希望同一个字典,在不同手机上都有相同的访问顺序的时候,怎么办呢,我们可以重写字典的遍历方法pairs
下面来实例使用一下新pairs
写一个默认的比较函数供大家使用,如果不想写比较函数的话,可以使用下面的
使用方法
当大家遇到lua给的方法不够使用的时候,大家可以自定义哦。
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 end end if (done == false) then ary[lastUsed + 1] = key end end lastUsed = lastUsed + 1 end -- 定义并返回迭代器 local i = 0 local iter = function () i = i + 1 if ary[i] == nil then return nil else return ary[i], tbl[ary[i]] end end return 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后比较字符串 end end
使用方法
for k,v in pairs(table_name, defaultComp) do -- body... end
当大家遇到lua给的方法不够使用的时候,大家可以自定义哦。
相关文章推荐
- 同时创建多个线程,它们都访问一个对象中的同步方法,怎么确保第一个线程最先拿到对象锁,否则,怎么保证多个线程之间的有序通信
- Lua中访问table里函数的方法示例
- Python中将字典转换为有序列表、无序列表的方法
- Java中的类成员访问控制符和继承重写父类的方法时的类成员访问控制符的相关问题
- Lua使用C++中的类——调用类方法并访问类变量
- Python有序字典简单实现方法示例
- Lua使用C++中的类——调用类方法并访问类变量
- 为何Java中子类重写方法的访问权限不能低于父类中权限
- Linux中 Lua 访问Sql Server的配置方法
- 字典转模型 重写初始化方法
- python字典访问的三种方法
- url重写—适用html为伪静态后真实的html无法访问的解决方法
- 在一个集合中存储了无序并且重复的字符串,定义一个方法,让其有序(字典顺序),而且还不能去除重复
- Java知识(访问修饰符、方法重写和方法重载的区别以及java抽象)
- Java子父类初始化顺序,及重写方法后的访问修饰符,异常抛出
- 网络访问不能在主线程中,要新建一个子线程,重写run()方法。
- [CCS]China Community Server几乎所有被重写的URL都无法访问的解决方法
- 类、对象、继承、封装、多态、方法的重载和重写、Java的访问修饰符与其它关键字
- cocos lua绑定感悟---tolua_isusertable及lua如何访问cocos静态函数的方法
- Python cookbook(数据结构与算法)让字典保持有序的方法