2010-01-19 85 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