Lua中实现嵌套表的唯一元素插入功能求助
Lua嵌套表去重插入实现
需求说明
需要维护如下结构的嵌套表datavalues:
datavalues={{VALUE=896},{VALUE=965},{VALUE=569}}
调用addtotable(id)时,同一个id仅首次调用插入子表,重复调用不添加;后续还需支持给子表新增TIMESTAMP字段,最终结构如下:
datavalues={{VALUE=896, TIMESTAMP=596664},{VALUE=965, TIMESTAMP=597864},{VALUE=569, TIMESTAMP=597864}}
原代码问题分析
你提供的addtotable函数存在逻辑错误:
datavalues={} function addtotable(id) if #datavalues==0 then table.insert(datavalues,{VALUE=id}) end if #datavalues>0 then for i=1,#datavalues do if datavalues[i].VALUE==id then break else table.insert(datavalues,{VALUE=id}) end end end end
- 循环逻辑错误:遍历表时,只要遇到一个
VALUE不等于id的元素就执行插入操作,导致重复调用时会多次插入相同VALUE的子表 - 冗余判断:
#datavalues==0和#datavalues>0是互斥的,无需分开判断
正确实现方案
基础遍历版(适合小数据量)
遍历整个嵌套表,确认目标id不存在后再插入:
datavalues = {} function addtotable(id) local exists = false -- 遍历检查是否已存在该id for _, item in ipairs(datavalues) do if item.VALUE == id then exists = true break end end -- 不存在则插入新子表 if not exists then table.insert(datavalues, {VALUE = id}) end end
高效哈希版(适合大数据量)
新增辅助哈希表记录已添加的id,将查找复杂度降为O(1),完全不影响原嵌套表结构:
datavalues = {} local existingIds = {} -- 辅助表,仅用于快速查重 function addtotable(id) if not existingIds[id] then table.insert(datavalues, {VALUE = id}) existingIds[id] = true end end
后续使用示例
两种方案都能保留原嵌套表结构,后续可正常给子表添加TIMESTAMP字段:
-- 给第一个子表添加TIMESTAMP datavalues[1].TIMESTAMP = 596664 -- 遍历批量添加TIMESTAMP for i, item in ipairs(datavalues) do item.TIMESTAMP = os.time() -- 示例用当前时间戳 end
内容的提问来源于stack exchange,提问作者Youcef
相关产品推荐
相关产品推荐

