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!

¿Fue útil?

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 ...)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top