Conseguir índice de entrada de la tabla
Pregunta
No se puede conseguir índice de entrada de la tabla. Lo necesito para eliminar un elemento de la tabla.
Yo uso table.insert
para añadir entradas a la tabla.
Otra pregunta: ¿por qué Lua no tiene "sobrecarga" a table.remove función de lo que uno puede remover el artículo por el índice asociativo
Solución
elimina t[k]=nil
de t
la entrada con k
clave.
Para la segunda pregunta, la respuesta es que las tablas pueden tener metatablas individuales.
Otros consejos
Tablas implementar una desordenada uno a muchos relación entre claves y valores. En otras palabras, cualquier tecla especial (índice) sólo puede aparecer una vez en la mesa, pero el valor puede aparecer varias veces.
Si conoce el k
clave, entonces t[k] = nil
eliminará la clave y el valor asociado de la mesa. Sin embargo, esta operación no tiene efecto en ninguna otra tecla o valores de la tabla.
Las funciones table.insert
y table.remove
operan sobre el conjunto de teclas de números enteros secuenciales que comienza en 1, que se utilizan por convención para implementar arrays o listas. A tal fin, manipulan otros valores en la lista con el fin de mantener la lista de los agujeros en desarrollo.
Una forma de encontrar una clave con la que se encontró algún valor es simplemente buscar en la tabla. Si esto se hará más de una vez, entonces es probablemente una buena idea para construir una segunda tabla que invierte los pares clave / valor de manera que las operaciones de búsqueda de valor es lo más rápido que las operaciones de búsqueda por índice.
Una implementación adecuada dependerá de sus supuestos y necesidades. Algunas muestras son:
-- 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