ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันต้องการเพิ่มบางอย่างสำหรับคนรุ่นหลัง วิธีง่ายๆในการจัดการปัญหาที่คุณมีคือการสร้างตารางอื่นที่มีค่าเป็นกุญแจสำคัญ
กล่าวคือ. คุณมีตาราง 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 สำเนาของวัตถุเดียวกัน หากตารางของคุณมีขนาดเล็กมากก็จะมีความสำคัญน้อยกว่ามากซึ่งอาจทำให้การวนซ้ำเร็วกว่าการค้นหาแผนที่แบบอื่น
อย่างไรก็ตามข้อความของคำถามแสดงให้เห็นอย่างยิ่งว่าคุณมีรายการจำนวนมากที่ต้องจัดการ