script print array lua set unique contains lua-table

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.