Bunun eski bir gönderi olduğunu biliyorum ama gelecek nesil için bir şeyler eklemek istedim. Sahip olduğunuz sorunu ele almanın basit yolu, anahtar değeri olan başka bir tablo yapmaktır.
yani. aynı değere sahip, biri bir yönü gösteren, biri diğerini gösteren 2 tablonuz var.
function addValue(key, value)
if (value == nil) then
removeKey(key)
return
end
_primaryTable[key] = value
_secodaryTable[value] = key
end
function removeKey(key)
local value = _primaryTable[key]
if (value == nil) then
return
end
_primaryTable[key] = nil
_secondaryTable[value] = nil
end
function getValue(key)
return _primaryTable[key]
end
function containsValue(value)
return _secondaryTable[value] ~= nil
end
Daha sonra yeni tabloyu, anahtar "element" e sahip olup olmadığını görmek için sorgulayabilirsiniz. Bu, diğer tablonun her değerini yineleme ihtiyacını önler.
Örneğin bir dize olmadığı için 'element'i aslında bir anahtar olarak kullanamayacağınız ortaya çıkarsa, o zaman örneğin tostring
üzerine bir sağlama toplamı ekleyin ve sonra bunu anahtar olarak kullanın.
Bunu neden yapmak istiyorsun? Tablolarınız çok büyükse, her öğe üzerinde yineleme yapmak için gereken süre önemli olacaktır ve bu da çok sık yapmanıza engel olacaktır. Ek bellek yükü, aynı nesnenin 2 kopyası yerine aynı nesneye 2 işaretçi depolayacağından nispeten küçük olacaktır. Tablolarınız çok küçükse, çok daha az önemli olacaktır, hatta yinelemek başka bir harita aramasına göre daha hızlı olabilir.
Bununla birlikte, sorunun ifadesi, ilgilenmeniz gereken çok sayıda öğenizin olduğunu güçlü bir şekilde göstermektedir.