Dictionary 推字典?如何在Lua中实现这一点?

Dictionary 推字典?如何在Lua中实现这一点?,dictionary,lua,lua-table,Dictionary,Lua,Lua Table,假设我有这本字典 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 = {ne

假设我有这本字典

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}

考虑到字典键不能保存它们输入的位置,我写了一些东西,应该能够帮助您实现您想要的,不管怎样

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)

函数将完成这项工作。节日快乐

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

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
局部函数ld_next(t,i)——这是一个有序迭代器,最早的一个。

如果我问你为什么要这样做?字典键不会按照你输入它们的顺序保存它们,不像索引那样,所以我不知道你能不能把它推到最前面。你/可以/使用索引表(在意识到你需要字典之前,我为其编写了一个函数)。@lhf只是为了编写一个游戏,我需要一个具有固定大小的字典,并在添加新的对时(一旦达到固定大小)推出最旧的键/值对.为什么要在
fifo\u push
中创建一个新表?因为fifo是一个输入值的索引表,我想我认为重建它的方式对于“先进先出”模型来说是最有利的方式。现在编辑它以获得更清晰的功能。谢谢谢谢,这对我来说是最简单的。虽然有些有点过头了,所以我有点盲目地使用它,呵呵。 dest2 20 dest3 30 dest4 50