나는 이것이 오래된 게시물이라는 것을 알고 있지만 후손을 위해 무언가를 추가하고 싶었습니다. 당신이 가지고있는 문제를 처리하는 간단한 방법은 중요한 가치의 다른 테이블을 만드는 것입니다.
즉. 하나는 한 방향을 가리키고 다른 하나는 다른 방향을 가리키는 동일한 값을 가진 2 개의 테이블이 있습니다.
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
그런 다음 새 테이블을 쿼리하여 키 '요소'가 있는지 확인할 수 있습니다. 이렇게하면 다른 테이블의 모든 값을 반복 할 필요가 없습니다.
예를 들어 문자열이 아니기 때문에 실제로 '요소'를 키로 사용할 수없는 것으로 판명되면 체크섬이나 예를 들어 그 위에 추가 한 tostring
다음 키로 사용합니다.
왜 이렇게 하시겠습니까? 테이블이 매우 큰 경우 모든 요소를 반복하는 데 많은 시간이 소요되어이를 자주 수행하지 못하게됩니다. 추가 메모리 오버 헤드는 동일한 객체의 2 개 사본이 아닌 동일한 객체에 대한 2 개의 포인터를 저장하기 때문에 상대적으로 적습니다. 테이블이 매우 작 으면 훨씬 덜 중요합니다. 사실 다른 맵 조회보다 반복하는 것이 더 빠를 수 있습니다.
그러나 질문의 표현은 처리해야 할 항목이 많음을 강력하게 암시합니다.