我无法获得表项索引。我需要它从表中删除一个项目。
我使用table.insert
向表中添加条目。
另一个问题:为什么Lua没有“重载”函数table.remove所以可以通过关联索引删除项目?
答案 0 :(得分:7)
表实现了键和值之间无序的一对多关系。换句话说,任何特定的键(索引)只能在表中出现一次,但值可以多次出现。
如果您知道密钥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
答案 1 :(得分:1)
t[k]=nil
使用密钥t
从k
条目中删除。
对于第二个问题,答案是表格可以有单独的元表。