Wiem, że to stary post, ale chciałem dodać coś dla potomności. Prostym sposobem rozwiązania problemu, który masz, jest utworzenie innej tabeli o wartości do klucza.
to znaczy. masz 2 tabele o tej samej wartości, jedna wskazuje w jednym kierunku, a druga w drugą.
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
Następnie możesz wysłać zapytanie do nowej tabeli, aby sprawdzić, czy zawiera kluczowy „element”. Zapobiega to konieczności iteracji przez każdą wartość w drugiej tabeli.
Jeśli okaże się, że w rzeczywistości nie możesz użyć `` elementu '' jako klucza, ponieważ nie jest to na przykład łańcuch, dodaj sumę kontrolną lub tostring
na przykład do niej, a następnie użyj tego jako klucza.
Dlaczego chcesz to zrobić? Jeśli twoje tabele są bardzo duże, ilość czasu na iterację przez każdy element będzie znacząca, uniemożliwiając ci wykonywanie tego bardzo często. Dodatkowy narzut pamięci będzie stosunkowo niewielki, ponieważ będzie przechowywać 2 wskaźniki do tego samego obiektu, a nie 2 kopie tego samego obiektu. Jeśli twoje tabele są bardzo małe, będzie to miało znacznie mniejsze znaczenie, w rzeczywistości iteracja może być nawet szybsza niż ponowne wyszukiwanie mapy.
Sformułowanie pytania jednak silnie sugeruje, że masz do czynienia z dużą liczbą spraw.