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!

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top