Confronti di tabelle Lua all'interno delle tabelle
-
28-10-2019 - |
Domanda
Quindi ho una tabella che contiene riferimenti ad altre tabelle come:
local a = newObject()
a.collection = {}
for i = 1, 100 do
local b = newObject()
a[#a + 1] = b
end
Ora, se voglio vedere se un particolare oggetto è all'interno di "A", devo usare coppie come così:
local z = a.collection[ 99 ]
for i,j in pairs( a.collection ) do
if j == z then
return true
end
end
L'oggetto Z è al 99 ° posto e dovrei aspettare le coppie per iterare fino in fondo agli altri 98 oggetti. Questa configurazione sta facendo strisciare il mio programma. C'è un modo per creare una sorta di chiave che non è una stringa o un confronto da tavolo a tabella che è una fodera? Piace:
if a.collection[{z}] then return true end
Grazie in anticipo!
Soluzione
Perché stai memorizzando l'oggetto nello slot del valore e non nella slot chiave della tabella?
local a = newObject()
a.collection = {}
for i = 1, 100 do
local b = newObject()
a.collection[b] = i
end
Per vedere se un oggetto particolare è all'interno di "A"
return a.collection[b]
Se hai bisogno di accesso intero indicizzato alla raccolta, memorizza in entrambi i modi:
local a = newObject()
a.collection = {}
for i = 1, 100 do
local b = newObject()
a.collection[i] = b
a.collection[b] = i
end
Scoperta:
local z = a.collection[99]
if a.collection[z] then return true end
Altri suggerimenti
Non so se è più veloce o no, ma forse questo aiuta:
Riempimento:
local a = {}
a.collection = {}
for i = 1, 100 do
local b = {}
a.collection[b] = true -- Table / Object as index
end
Scoperta:
local z = a.collection[99]
if a.collection[z] then return true end
Se non è quello che volevi fare, puoi rompere l'intero array in secchi più piccoli e usare un hash per tenere traccia di quale oggetto appartiene a quale secchio.
Potresti prendere in considerazione l'idea di passare dall'uso delle coppie () all'utilizzo di un ciclo normale e indicizzare la tabella, le coppie () sembrano essere più lente su raccolte più grandi di tabelle.
for i=1, #a.collection do
if a.collection[i] == z then
return true
end
end
Ho confrontato la velocità di iterazione attraverso una raccolta di 1 milione di tabelle usando entrambe le coppie () e l'indicizzazione delle tabelle e l'indicizzazione era un po 'più veloce ogni volta. Provalo da solo usando OS.Clock () per profilare il tuo codice.
Non riesco davvero a pensare a un modo più veloce della tua soluzione oltre all'utilizzo di una sorta di funzione di hashing per impostare indici unici nella tabella A.Collection. Tuttavia, farlo renderebbe un tavolo specifico un compito non banale (non saresti solo in grado di fare A.Collection [99], dovresti ripetere fino a quando non hai trovato quello che volevi. Ma poi tu potrebbe facilmente testare se la tabella fosse in A.Collection facendo qualcosa come A.Collection [Hashfunc (Z)] ~ = nil ...)