浅析Lua中table的遍历

来源:互联网 发布:avmo.pw新域名 编辑:程序博客网 时间:2024/05/18 20:07

原文:http://rangercyh.blog.51cto.com/1444712/1032925

既然这里谈到了遍历,就说一下目前看到的几种针对table的遍历方式:

for i=1, #tbtest do --这种方式无法遍历所有的元素,因为'#'只会获取tbtest中从key为1开始的key连续的那几个元素,如果没有key为1,那么这个循环将无法进入

for i=1, table.maxn(tbtest) do --这种方式同样无法遍历所有的元素,因为table.maxn只会获取key为整数中最大的那个数,遍历的元素其实是查找tbtest[1]~tbtest[整数key中最大值],所以,对于string做key的元素不会去查找,而且这么查找的效率低下,因为如果你整数key中定义的最大的key是10000,然而10000以下的key没有几个,那么这么遍历会浪费很多时间,因为会从1开始直到10000每一个元素都会查找一遍,实际上大多数元素都是不存在的,比如:

tbtest = {      [1] = 1,      [10000] = 2,  }  local count = 0  for i=1, table.maxn(tbtest) do      count = count + 1      print(tbtest[i])  end  print(count) 

你会看到打印结果是多么的坑爹,只有1和10000是有意义的,其他的全是nil,而且count是10000。耗时非常久。一般我不这么遍历。但是有一种情况下又必须这么遍历,这个在我的工作中还真的遇到了,这是后话,等讲完了再谈。




它的方法是把你所需要遍历的table里的key按照遍历顺序放到另一个临时的table中去,这样只需要遍历这个临时的table按顺序取出原table中的key就可以了。如下:

首先定义一个迭代器:

function pairsByKeys(t)      local a = {}      for n in pairs(t) do          a[#a+1] = n      end      table.sort(a)      local i = 0      return function()          i = i + 1          return a[i], t[a[i]]      end  end 

然后在遍历的时候使用这个迭代器就可以了,table同上,遍历如下:

for key, value in pairsByKeys(tbtestAward) do      if nSeq <= key then          return key      end  end 


0 0
原创粉丝点击