如何按ID对Lua的ITEMSCRAPESTATS表进行排序?
Lua中按ID排序ITEMSCRAPESTATS表的解决方案
问题根源
Lua的哈希表(即使用非连续整数键或字符串键的表)不维护键的存储顺序,你当前的ITEMSCRAPESTATS是用物品ID作为键的哈希表,Lua会根据内部哈希算法存储这些键,所以你看到的表结构顺序不是按键排序的,也无法直接对哈希表本身进行排序。
解决方案
方案1:维护有序键数组,按需遍历
不需要修改原有的ITEMSCRAPESTATS结构,只需要额外维护一个存储物品ID的数组,对数组排序后,按数组顺序访问哈希表的数据即可实现有序输出或处理:
-- 获取排序后的物品ID数组(升序) function getSortedItemIDs() local ids = {} -- 收集所有物品ID for id in pairs(ITEMSCRAPESTATS) do table.insert(ids, id) end -- 对ID数组升序排序 table.sort(ids) return ids end -- 示例:按ID升序遍历并输出所有物品数据 local sortedIDs = getSortedItemIDs() for _, id in ipairs(sortedIDs) do local itemStats = ITEMSCRAPESTATS[id] print("=== 物品ID: " .. id .. " ===") for _, line in ipairs(itemStats) do print(line) end end
方案2:修改数据结构为有序数组
如果需要从存储阶段就保证顺序,可以将原哈希表改为数组结构,每个元素包含物品ID和对应的统计数据,直接对数组排序:
修改后的ess函数:
-- 初始化数组形式的存储表(替代原哈希表) if not ITEMSCRAPESTATS_ARRAY then ITEMSCRAPESTATS_ARRAY = {} end function ess(x) local itemData = {id = x, stats = {}} ES:SetHyperlink("item:"..x..":0:0:0:0:0:0:0") if _G["ESTooltipTextLeft2"]:GetText() then for i=1, ES:NumLines() do local text = _G["ESTooltipTextLeft"..i]:GetText() table.insert(itemData.stats, text) end print("Scraping Stats for Item Number: "..x) else table.insert(itemData.stats, "No Stats for Item Number") print("No Stats for Item Number: "..x) end -- 检查是否已存在该ID,避免重复添加,若存在则更新数据 local exists = false for _, entry in ipairs(ITEMSCRAPESTATS_ARRAY) do if entry.id == x then entry.stats = itemData.stats exists = true break end end if not exists then table.insert(ITEMSCRAPESTATS_ARRAY, itemData) end -- 对数组按ID升序排序 table.sort(ITEMSCRAPESTATS_ARRAY, function(a, b) return a.id < b.id end) end
此时ITEMSCRAPESTATS_ARRAY就是按物品ID升序排列的数组,直接用ipairs遍历即可得到有序结果。
内容的提问来源于stack exchange,提问作者Josh Stevens
相关产品推荐
相关产品推荐

