2013-12-25 3 views
4

Скажем, у меня есть этот словарь в LuaНажмите словарь? Как добиться этого в 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} 
+4

Зачем вам это нужно? – lhf

+1

Словарь-ключи не сохраняют их в том порядке, в котором вы их вводите, а не как индексы, поэтому я не знаю, что вы сможете нажать его на передний план. Вы/можете/сделать это с помощью индексной таблицы (которую я написал для функции, прежде чем вы понимаете, что вам нужен словарь). – Josh

+0

@lhf только для написания игры, мне нужен был словарь с фиксированным размером и выталкивал старую пару ключей/значений при добавлении новой пары (как только фиксированный размер был достигнут). – regularjoe

ответ

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-й индекс, указывающий предел уникальных ключей, таблица может иметь.

+0

Спасибо, это сработало для меня самым простым. Хотя некоторые из них немного над моей головой, поэтому я использую его вслепую, хе-хе. – regularjoe

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 

Вы должны создать таблицу ФИФО первой, на основании того, вы ввели ключи (например, ФИФО = { «dest3», «dest2», «dest1»}, основываясь на своем посту, от первого введенного до последнего введенного), затем используйте:

push_old(places, "newdest", 50) 

и функция будет выполнять работу. Счастливых праздников!

+2

Зачем создавать новую таблицу в 'fifo_push'? – lhf

+0

Поскольку fifo - это таблица индексов введенных значений, я предполагаю, что я понял, как я перестроил это было бы самым выгодным способом для модели «First in, First Out». Теперь отредактируйте его для более чистой функции. Благодаря! – Josh

Смежные вопросы