推词典?如何在Lua中实现这一目标?

时间:2013-12-25 17:52:33

标签: dictionary lua lua-table

说我在Lua有这本词典

places = {dest1 = 10, dest2 = 20, dest3 = 30}

在我的程序中,我检查字典是否符合我在这种情况下的大小限制3,如何将最旧的键/值对从字典中推出并添加一个新字符串?

places["newdest"] = 50

--places should now look like this, dest3 pushed off and newdest added and dictionary has kept its size

places = {newdest = 50, dest1 = 10, dest2 = 20}

2 个答案:

答案 0 :(得分:3)

如果真的需要它,那么这样做并不太难,而且它也很容易重复使用。

local function ld_next(t, i) -- This is an ordered iterator, oldest first.
  if i <= #t then
    return i + 1, t[i], t[t[i]]
  end
end

local limited_dict = {__newindex = function(t,k,v)
  if #t == t[0] then -- Pop the last entry.
    t[table.remove(t, 1)] = nil
  end
  table.insert(t, k)
  rawset(t, k, v)
end, __pairs = function(t)
  return ld_next, t, 1
end}

local t = setmetatable({[0] = 3}, limited_dict)

t['dest1'] = 10
t['dest2'] = 20
t['dest3'] = 30
t['dest4'] = 50

for i, k, v in pairs(t) do print(k, v) end
dest2   20
dest3   30
dest4   50

订单存储在数字索引中,0索引表示表可以拥有的唯一键的限制。

答案 1 :(得分:0)

鉴于字典键没有保存他们输入的位置,我写了一些应该能够帮助你完成你想要的东西,无论如何。

function push_old(t, k, v)
  local z = fifo[1]
  t[z] = nil
  t[k] = v
  table.insert(fifo, k)
  table.remove(fifo, 1)
end

您需要先根据输入密钥的顺序创建fifo表(例如,fifo = {“dest3”,“dest2”,“dest1”},根据您的帖子,从第一次输入到最后输入),然后使用:

push_old(places, "newdest", 50)

并且该功能将完成工作。节日快乐!