Получение индекса записи таблицы
Я не могу получить индекс записи таблицы. Мне нужно, чтобы удалить элемент из таблицы.
я использую table.insert
добавить записи в таблицу.
Другой вопрос: почему у Lua нет "перегрузки" для функции table.remove, чтобы можно было удалить элемент по ассоциативному индексу?
2 ответа
t[k]=nil
удаляет из t
запись с ключом k
,
На второй вопрос ответ таков: таблицы могут иметь отдельные метатаблицы.
Таблицы реализуют неупорядоченное отношение один ко многим между ключами и значениями. Другими словами, любой конкретный ключ (индекс) может появляться в таблице только один раз, но значение может появляться несколько раз.
Если вы знаете ключ k
, затем t[k] = nil
удалит и ключ и связанное значение из таблицы. Однако эта операция не влияет на любые другие ключи или значения в таблице.
table.insert
а также table.remove
функции работают с набором последовательных целочисленных ключей, начинающихся с 1, которые по соглашению используются для реализации массивов или списков. Для этого они манипулируют другими значениями в списке, чтобы не допустить появления дыр в списке.
Один из способов найти ключ, по которому найдено какое-либо значение, - просто выполнить поиск в таблице. Если это будет сделано более одного раза, то, вероятно, будет хорошей идеей построить вторую таблицу, которая инвертирует пары ключ / значение, так что поиск по значению выполняется так же быстро, как поиск по индексу.
Подходящая реализация будет зависеть от ваших предположений и потребностей. Некоторые образцы:
-- return the first integer index holding the value
function AnIndexOf(t,val)
for k,v in ipairs(t) do
if v == val then return k end
end
end
-- return any key holding the value
function AKeyOf(t,val)
for k,v in pairs(t) do
if v == val then return k end
end
end
-- return all keys holding the value
function AllKeysOf(t,val)
local s={}
for k,v in pairs(t) do
if v == val then s[#s+1] = k end
end
return s
end
-- invert a table so that each value is the key holding one key to that value
-- in the original table.
function Invert(t)
local i={}
for k,v in pairs(t) do
i[v] = k
end
return i
end