Question

J'ai donc une table qui contient des références à d'autres tables comme:

local a = newObject()
a.collection = {}
for i = 1, 100 do
    local b = newObject()
    a[#a + 1] = b
end 

Maintenant, si je veux voir si un objet particulier est dans "a", je dois utiliser des paires comme ceci:

local z = a.collection[ 99 ]
for i,j in pairs( a.collection ) do
    if j == z then
    return true
  end
end

L'objet z est à la 99e place et je devrais attendre que les paires itèrent tout au long des 98 autres objets.Cette configuration permet à mon programme d'explorer.Existe-t-il un moyen de créer une sorte de clé qui ne soit pas une chaîne ou une comparaison table à table qui soit une ligne?Comme:

if a.collection[{z}] then return true end

Merci d'avance!

Était-ce utile?

La solution

Pourquoi stockez-vous l'objet dans l'emplacement de valeur et non dans l'emplacement de clé de la table?

local a = newObject()
a.collection = {}
for i = 1, 100 do
    local b = newObject()
    a.collection[b] = i
end 

pour voir si un objet particulier se trouve dans "a"

return a.collection[b]

Si vous avez besoin d'un accès indexé en entier à la collection, stockez-le dans les deux sens:

local a = newObject()
a.collection = {}
for i = 1, 100 do
    local b = newObject()
    a.collection[i] = b
    a.collection[b] = i
end 

Recherche:

local z = a.collection[99]
if a.collection[z] then return true end

Autres conseils

Je ne sais pas si c'est plus rapide ou pas, mais peut-être que cela aide:

Remplissage:

local a = {}
a.collection = {}
for i = 1, 100 do
    local b = {}
    a.collection[b] = true  -- Table / Object as index
end

Recherche:

local z = a.collection[99]
if a.collection[z] then return true end

Si ce n'est pas ce que vous vouliez faire, vous pouvez diviser tout votre tableau en compartiments plus petits et utiliser un hachage pour savoir quel objet appartient à quel compartiment.

vous voudrez peut-être envisager de passer de l'utilisation de paires () à l'utilisation d'une boucle for classique et d'indexer la table, paires () semble être plus lente sur de plus grandes collections de tables.

for i=1, #a.collection do
    if a.collection[i] == z then
        return true
    end
end

J'ai comparé la vitesse d'itération à travers une collection de 1 million de tables en utilisant à la fois des paires () et une indexation de table, et l'indexation était un peu plus rapide à chaque fois.essayez-le vous-même en utilisant os.clock () pour profiler votre code.

Je ne peux pas vraiment penser à un moyen plus rapide de votre solution autre que d'utiliser une sorte de fonction de hachage pour définir des index uniques dans la table a.collection.cependant, faire cela rendrait la sortie d'une table spécifique une tâche non triviale (vous ne seriez pas seulement capable de faire une collection [99], vous auriez à parcourir jusqu'à ce que vous trouviez celle que vous vouliez.pourrait facilement tester si la table était dans une.collection en faisant quelque chose comme a.collection [hashFunc (z)] ~= nil ...)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top