【问题标题】:Remove duplicates from LUA Table by timestamp按时间戳从 LUA 表中删除重复项
【发布时间】:2014-04-24 23:39:01
【问题描述】:

几天前我在堆栈上寻求帮助插入记录以防止重复。然而,进入这些的过程很慢,它们会溜进去。

我有大约 10,000 名玩家的用户群,他们有重复的条目。我一直试图过滤掉这些重复的条目,但没有成功。堆栈上的示例对我来说没有任何效果。

这是我桌子上的一个片段

    [18] = 
                {
                    ["soldAmount"] = 25,
                    ["buyer"] = [[@playername]],
                    ["timestampz"] = 1398004426,
                    ["secsSinceEvent"] = 55051,
                    ["guildName"] = [[TradingGuild]],
                    ["eventType"] = 15,
                    ["seller"] = [[@myname]],
                },
    [19] = 
                {
                    ["soldAmount"] = 25,
                    ["buyer"] = [[@playername]],
                    ["timestampz"] = 1398004426,
                    ["secsSinceEvent"] = 55051,
                    ["guildName"] = [[TradingGuild]],
                    ["eventType"] = 15,
                    ["seller"] = [[@myname]],
                },

时间戳的匹配,它们不应该被添加。

  for k,v in pairs(sellHistory) do mSavedTHVars.Forever_Sales[k] = v
    if mSavedTHVars.Forever_Sales.timestampz ~= sellHistory.timestampz then
      table.insert(mSavedTHVars.Forever_Sales, sellHistory)
    end end

现在,我需要了解如何删除当前的重复项,这是我尝试过的。

function table_unique(tt)
  local newtable = {}
  for ii,xx in ipairs(tt) do
    if table_count(newtable.timestampz, xx) ~= tt.timestampz then
      newtable[#newtable+1] = xx
    end
  end
  return newtable
end

我希望所提供的信息清晰易懂。

谢谢!

更新

尝试 #20 ;)

  for k,v in pairs(mSavedTHVars.Forever_Sales) do
    if v == mSavedTHVars.Forever_Sales.timestampz then
      table.remove(mSavedTHVars.Forever_Sales,k)
    end
  end

还没有运气。

更新

成功了

  for k,v in pairs(mSavedTHVars.Forever_Sales) do mSavedTHVars.Forever_Sales[k] = v
    if v.timestampz == mSavedTHVars.Forever_Sales.timestampz then
      table.remove(mSavedTHVars.Forever_Sales, k)
    end
  end

这是一个好方法吗?

【问题讨论】:

    标签: lua lua-table deduplication


    【解决方案1】:

    假设 mSavedTHVars.Forever_Sales[18]mSavedTHVars.Forever_Sales[19] 是您在帖子中列出的表,那么要删除基于相同时间戳的所有重复项,最简单的方法是创建基于时间戳的“集合”(因为时间戳是您的条件唯一性)。循环遍历您的 mSavedTHVars.Forever_Sales 并为每个项目添加项目到新表,前提是其时间戳尚未设置:

    function removeDuplicates(tbl)
        local timestamps = {}
        local newTable = {}
        for index, record in ipairs(tbl) do
            if timestamps[record.timestampz] == nil then
                timestamps[record.timestampz] = 1
                table.insert(newTable, record)
            end
        end
        return newTable
    end
    
    mSavedTHVars.Forever_Sales = removeDuplicates(mSavedTHVars.Forever_Sales)
    

    基于问题更新的更新:

    我对以下提议的解决方案的评论:

    for k,v in pairs(mSavedTHVars.Forever_Sales) do 
      mSavedTHVars.Forever_Sales[k] = v
      if v.timestampz == mSavedTHVars.Forever_Sales.timestampz then
        table.remove(mSavedTHVars.Forever_Sales, k)
      end
    end
    

    问题是我不明白它是如何工作的。当您执行for k,v in pairs(mSavedTHVars.Forever_Sales) do 时,vmSavedTHVars.Forever_Sales[k],所以下一行mSavedTHVars.Forever_Sales[k] = v 什么也不做。然后if v.timestampz == mSavedTHVars.Forever_Sales.timestampzv(即mSavedTHVars.Forever_Sales[k])的时间戳与mSavedTHVars.Forever_Salestimestampz 字段的值进行比较。但后者是没有此类字段的表,因此== 的右侧将为 nil,因此仅当 v.timestampz 为 nil 时条件才会成立,我认为情况并非如此。

    我使用创建新表而不是从现有表中删除重复项的解决方案的主要原因是,您可以在使用pairs 或ipairs 对其进行迭代时编辑表。如果你要使用反向计数器,它可能会没问题(但我没有测试,测试确定):

    function removeDuplicates(tbl)
        local timestamps = {}
        local numItems = #tbl
        for index=numItems, 1, -1, do
            local record = tbl[index]
            if timestamps[record.timestampz] ~= nil then
                table.remove(newTable, index)
            end
            timestamps[record.timestampz] = 1
        end
    end
    

    我也觉得这个函数的意图不是很清楚,但也许这只是个人喜好。

    【讨论】:

    • 我在上面添加了一个更新,它似乎正在工作。这看起来是个好方法吗?
    • @WilliamRussell 不,我清理了我的答案,因为我意识到尝试我讨论的前两种解决方案是没有意义的,最后一个是最好的,我希望这是你接受的那个。
    • 谢谢,这似乎也有效。从这个功能和我上面的更新你认为会有什么区别(或对我的伤害)? --Edit 我打算用你的……只是好奇
    • @WilliamRussell 我扩展了我的答案以讨论您提出的解决方案,并提供了使用删除而不是新表插入的替代方案。
    猜你喜欢
    • 2013-08-22
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多