Ottenere indice di voce della tabella
Domanda
Non riesco a indice di voce della tabella. Ne ho bisogno per rimuovere un elemento dalla tabella.
Io uso table.insert
per aggiungere voci al tavolo.
Un'altra domanda: perché Lua non ha "sovraccarico" di funzionare table.remove così si può rimuovere voce per indice associativo
?Soluzione
t[k]=nil
rimuove dal t
la voce con k
chiave.
Per la seconda domanda, la risposta è che le tabelle possono avere singoli metatables.
Altri suggerimenti
Tabelle attuare una non ordinata uno a molti relazione tra chiavi e valori. In altre parole, una particolare chiave (indice) può apparire solo una volta in una tabella, ma un valore può apparire più volte.
Se si conosce il k
chiave, quindi t[k] = nil
rimuoverà sia la chiave e il valore associato dalla tabella. Tuttavia, questa operazione non ha alcun effetto su altre chiavi o valori della tabella.
Le funzioni table.insert
e table.remove
funzionano sopra l'insieme di chiavi intere sequenziali che parte da 1, che sono usati convenzionalmente per implementare matrici o elenchi. A tal fine, essi manipolano altri valori nella lista in modo da mantenere la lista in via di sviluppo fori.
Un modo per trovare una chiave in cui un certo valore si trova è semplicemente cercare la tabella. Se questo sarà fatto più di una volta, allora è probabilmente una buona idea di costruire una seconda tabella che inverte le coppie chiave / valore in modo che ricerca per valore è veloce come ricerca per indice.
Un'implementazione adatto dipenderà vostre ipotesi e le esigenze. Alcuni esempi sono:
-- 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