循环 – 成对的Lua与写入的顺序相同

循环 – 成对的Lua与写入的顺序相同,第1张

概述有没有办法按照下面的表格以与写入顺序相同的方式循环一个表格? local tbl = { ["hello"] = 1, [2] = 2, [50] = 3, ["bye"] = 4, [200] = 5} 我的意思是,当我使用“成对”时,每次执行代码时我都会得到不同的顺序…… 我正在寻找这样的东西: function get_keys(tbl) 有没有办法按照下面的表格以与写入的顺序相同的方式循环一个表格?

local tbl = {    ["hello"] = 1,[2] = 2,[50] = 3,["bye"] = 4,[200] = 5}

我的意思是,当我使用“成对”时,每次执行代码时我都会得到不同的顺序……

我正在寻找这样的东西:

function get_keys(tbl)    local rtable = {}    for k,v in pairs(tbl) do        table.insert(rtable,k)    end    return rtableendlocal keys_of_tbl = get_keys(tbl)for i = 1,table.getn(keys_of_tbl) do    --Do something with: tbl[keys_of_tbl[i]]end

但是因为函数“get_keys”再次基于“成对”,它将无法工作……

解决方法 在Lua中,未指定对遍历键的顺序.但是,您可以保存在数组样式表中添加项的顺序,并使用ipairs(具有在数组中迭代键的已定义顺序).为此,您可以使用元表创建自己的有序表,以便在添加新键时保持键顺序.

编辑(早期代码在更新时插入了密钥的多个副本)

要做到这一点,你可以使用我们被调用的__newindex,只要索引没有添加到表中. ordered_add方法在隐藏表_keys和_values中更新,删除或存储密钥.请注意,当我们更新密钥时,也会始终调用__newindex,因为我们没有将值存储在表中,而是将其存储在“隐藏”表_keys和_values中.

但请注意,我们不能在此表中使用任何键,键名“_keys”将覆盖我们的隐藏表,因此更安全的替代方法是使用ordered_table.insert(t,key,value)ordered_table.index(t,key)和ordered_table.remove(t,key)方法.

ordered_table = {}function ordered_table.insert(t,k,v)  if not rawget(t._values,k) then -- new key     t._keys[#t._keys + 1] = k  end  if v == nil then -- delete key too.    ordered_table.remove(t,k)  else -- update/store value    t._values[k] = v   endendlocal function find(t,value)  for i,v in ipairs(t) do    if v == value then      return i    end  endend  function ordered_table.remove(t,k)  local v = t._values[k]  if v ~= nil then    table.remove(t._keys,find(t._keys,k))    t._values[k] = nil  end  return vendfunction ordered_table.index(t,k)    return rawget(t._values,k)endfunction ordered_table.pairs(t)  local i = 0  return function()    i = i + 1    local key = t._keys[i]    if key ~= nil then      return key,t._values[key]    end  endendfunction ordered_table.new(init)  init = init or {}  local t = {_keys={},_values={}}  local n = #init  if n % 2 ~= 0 then    error"in ordered_table initialization: key is missing value"  end  for i=1,n/2 do    local k = init[i * 2 - 1]    local v = init[i * 2]    if t._values[k] ~= nil then      error("duplicate key:"..k)    end    t._keys[#t._keys + 1]  = k    t._values[k] = v  end  return setMetatable(t,{__newindex=ordered_table.insert,__len=function(t) return #t._keys end,__pairs=ordered_table.pairs,__index=t._values    })end--- Example Usage:local t = ordered_table.new{  "hello",1,-- key,value pairs  2,2,50,3,"bye",4,200,5}print(#t)print("hello is",t.hello)print()for k,v in pairs(t) do  --- Lua 5.2 __pairs Metamethod  print(k,v)endt.bye = nil -- delete thatt[2] = 7 -- use integer keysprint(#t)
总结

以上是内存溢出为你收集整理的循环 – 成对的Lua与写入的顺序相同全部内容,希望文章能够帮你解决循环 – 成对的Lua与写入的顺序相同所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1231314.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存