Comparaisons de tableaux Lua dans les tableaux
-
28-10-2019 - |
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!
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 ...)