我無法獲取表項索引。我需要它從表格中刪除一個項目。我使用table.insert
向表中添加條目。獲取表項索引
另一個問題:爲什麼Lua沒有「重載」函數table.remove所以可以通過關聯索引刪除項目?
我無法獲取表項索引。我需要它從表格中刪除一個項目。我使用table.insert
向表中添加條目。獲取表項索引
另一個問題:爲什麼Lua沒有「重載」函數table.remove所以可以通過關聯索引刪除項目?
t[k]=nil
從t
中刪除輸入密鑰k
。
對於第二個問題,答案是表可以有個別metatables。
表實現鍵和值之間無序的一對多關係。換句話說,任何特定的鍵(索引)只能在表中出現一次,但一個值可以出現多次。
如果您知道密鑰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
謝謝。關於SO的關鍵/價值倒置方法還有其他解釋,但你是唯一一個幫助我「獲得它」的人。做得好。 – 2013-03-22 18:47:18
是的,但爲什麼沒有IndexOf,因爲它在C#或Java中? – mnn 2010-01-19 20:28:04