1

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

我有大约 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

这是一个好方法吗?

4

1 回答 1

2

假设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,下一行什么也不做v。然后将 的时间戳(即 的)与 中字段的值进行比较。但是后者是一个没有这个字段的表,所以右边的将是 nil,所以只有当它是 nil 时,条件才会为真,我不认为是这种情况。mSavedTHVars.Forever_Sales[k]mSavedTHVars.Forever_Sales[k] = vif v.timestampz == mSavedTHVars.Forever_Sales.timestampzvmSavedTHVars.Forever_Sales[k]timestampzmSavedTHVars.Forever_Sales==v.timestampz

我使用创建新表而不是从现有表中删除重复项的解决方案的主要原因是您可以在使用对或 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

另外我认为该功能的意图不是很清楚,但这可能只是个人喜好。

于 2014-04-23T04:33:22.277 回答