2010-01-19 86 views
3

我无法获取表项索引。我需要它从表格中删除一个项目。我使用table.insert向表中添加条目。获取表项索引

另一个问题:为什么Lua没有“重载”函数table.remove所以可以通过关联索引删除项目?

回答

1

t[k]=nilt中删除输入密钥k

对于第二个问题,答案是表可以有个别metatables。

+0

是的,但为什么没有IndexOf,因为它在C#或Java中? – mnn 2010-01-19 20:28:04

7

表实现键和值之间无序的一对多关系。换句话说,任何特定的键(索引)只能在表中出现一次,但一个值可以出现多次。

如果您知道密钥k,那么t[k] = nil将从表中删除密钥和关联值。但是,此操作不会影响表中的任何其他键或值。

table.inserttable.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 
+0

谢谢。关于SO的关键/价值倒置方法还有其他解释,但你是唯一一个帮助我“获得它”的人。做得好。 – 2013-03-22 18:47:18