Comparaciones de tabla de lua dentro de las tablas
-
28-10-2019 - |
Pregunta
Entonces tengo una tabla que tiene referencias a otras tablas como:
local a = newObject()
a.collection = {}
for i = 1, 100 do
local b = newObject()
a[#a + 1] = b
end
Ahora, si quiero ver si un objeto en particular está dentro de "A", tengo que usar pares como así:
local z = a.collection[ 99 ]
for i,j in pairs( a.collection ) do
if j == z then
return true
end
end
El objeto Z está en el puesto 99 y tendría que esperar a que pares se iteraran hasta los otros 98 objetos. Esta configuración está haciendo que mi programa se arrastre. ¿Hay alguna manera de hacer algún tipo de clave que no sea una comparación de cadena o una tabla para una tabla que sea un revestimiento de un solo revestimiento? Me gusta:
if a.collection[{z}] then return true end
¡Gracias por adelantado!
Solución
¿Por qué almacena el objeto en la ranura de valor y no en la ranura clave de la tabla?
local a = newObject()
a.collection = {}
for i = 1, 100 do
local b = newObject()
a.collection[b] = i
end
Para ver si un objeto en particular está dentro de "A"
return a.collection[b]
Si necesita acceso indexado entero a la colección, guárdelo en ambos sentidos:
local a = newObject()
a.collection = {}
for i = 1, 100 do
local b = newObject()
a.collection[i] = b
a.collection[b] = i
end
hallazgo:
local z = a.collection[99]
if a.collection[z] then return true end
Otros consejos
No sé si es más rápido o no, pero tal vez esto ayude:
Relleno:
local a = {}
a.collection = {}
for i = 1, 100 do
local b = {}
a.collection[b] = true -- Table / Object as index
end
hallazgo:
local z = a.collection[99]
if a.collection[z] then return true end
Si eso no es lo que querías hacer, puedes dividir toda tu matriz en cubos más pequeños y usar un hash para realizar un seguimiento de qué objeto pertenece a qué cubo.
Es posible que desee considerar cambiar de usar pares () al uso de un bucle regular e indexar la tabla, los pares () parece ser más lento en colecciones de tablas más grandes.
for i=1, #a.collection do
if a.collection[i] == z then
return true
end
end
Comparé la velocidad de iteración a través de una colección de 1 millón de tablas usando los pares () y la indexación de tabla, y la indexación fue un poco más rápida cada vez. Pruébelo usted mismo usando OS.Clock () para perfilar su código.
Realmente no puedo pensar en una forma más rápida de su solución que no sea usar algún tipo de función de hashing para establecer índices únicos en la tabla de colección A. Sin embargo, hacer esto haría que sacar una mesa específica una tarea no trivial (no solo podría hacer A.Collection [99], tendrá que iterar hasta que encontrara una que quería. Pero luego usted podría probar fácilmente si la tabla estaba en A.Collection haciendo algo como A.Collection [Hashfunc (Z)] ~ = nil ...)