print - push array lua
¿Cómo verificar si una tabla contiene un elemento en Lua? (4)
¿Hay algún método para verificar si una tabla contiene un valor? Tengo mi propia función (ingenua), pero me preguntaba si existe algo "oficial" para eso. O algo más eficiente ...
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
Por cierto, la razón principal por la que uso estas funciones es usar tablas como conjuntos, es decir, sin elementos duplicados. ¿Hay algo más que pueda usar?
No puedo pensar en otra forma de comparar valores, pero si usa el elemento del conjunto como la clave, puede establecer el valor en cualquier cosa que no sea nil. Luego, obtiene búsquedas rápidas sin tener que buscar en toda la tabla.
Puede poner los valores como las claves de la tabla. Por ejemplo:
function addToSet(set, key)
set[key] = true
end
function removeFromSet(set, key)
set[key] = nil
end
function setContains(set, key)
return set[key] ~= nil
end
Aquí hay un ejemplo más completo.
Sé que esta es una publicación anterior, pero quería agregar algo para la posteridad. La forma simple de manejar el problema que tiene es hacer otra tabla, de valor para la clave.
es decir. tienes 2 tablas que tienen el mismo valor, una apuntando en una dirección, una apuntando en la otra.
function addValue(key, value)
if (value == nil) then
removeKey(key)
return
end
_primaryTable.key = value
_secodaryTable.value = key
end
function removeKey(key)
local value = _primaryTable.key
if (value == nil) then
return
end
_primaryTable.key = nil
_secondaryTable.value = nil
end
function getValue(key)
return _primaryTable.key
end
function containsValue(value)
return _secondaryTable.value ~= nil
end
Luego puede consultar la nueva tabla para ver si tiene la clave ''elemento''. Esto evita la necesidad de iterar a través de cada valor de la otra tabla.
Si resulta que no puede usar realmente el ''elemento'' como clave, porque no es una cadena, por ejemplo, agregue una suma de comprobación o ''toString'' en ella, por ejemplo, y luego la use como la clave.
¿Por qué quieres hacer esto? Si sus tablas son muy grandes, la cantidad de tiempo para iterar a través de cada elemento será significativa, lo que le impedirá hacerlo con mucha frecuencia. La sobrecarga de memoria adicional será relativamente pequeña, ya que almacenará 2 punteros para el mismo objeto, en lugar de 2 copias del mismo objeto. Si sus tablas son muy pequeñas, entonces importará mucho menos, de hecho puede incluso ser más rápido iterar que tener otra búsqueda en el mapa.
Sin embargo, la redacción de la pregunta sugiere fuertemente que tiene una gran cantidad de elementos para tratar.
Teniendo en cuenta su representación, su función es tan eficiente como se puede hacer. Por supuesto, como lo notaron otros (y como se practica en idiomas más antiguos que Lua), la solución a su problema real es cambiar la representación. Cuando tiene tablas y quiere conjuntos, convierte las tablas en conjuntos usando el elemento set como la clave y true
como el valor. +1 a interjay.