推送字典?如何在Lua中实现?

假设我有这个 Lua 字典

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

在我的程序中,我会检查字典是否达到了我设定的大小限制(即3个元素),如果达到了该如何将最早的键/值对从字典中删除并添加一个新的键/值对?

places["newdest"] = 50

-- places 现在应该是这样的,dest3 被删除了,新的 newdest 添加了进去,字典大小没有改变

places = {newdest = 50, dest1 = 10, dest2 = 20}
点赞
用户308010
用户308010

考虑到字典键不会保存其输入的位置,我编写了一些内容,希望能帮助您实现所需的功能。

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)

这个函数就可以完成工作了。祝你节日快乐!

2013-12-25 20:24:29
用户828255
用户828255

如果你真的需要这样做,并且这也很容易重复使用。

local function ld_next(t, i) -- 这是一个按顺序排列的迭代器,从旧到新。
  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 -- 弹出最后一个条目。
      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个索引表示表可以拥有的唯一密钥的限制。

2013-12-26 00:57:06