按时间戳从 LUA 表中删除重复项。

我几天前在stackoverflow上寻求帮助,以防止记录重复插入。然而,输入它们的过程很慢,它们会滑入。

我的用户基数约为10,000人,他们有重复的记录。我一直在尝试过滤这些重复记录,但没有成功。stackoverflow上的示例对我没有帮助。

这是我表格中的剪辑。

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

“`

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

对于k,v in pairs(sellHistory),mSavedTHVars.Forever_Sales [k] = v
    if mSavedTHVars.Forever_Sales.timestampz〜= sellHistory.timestampz then
      table.insert(mSavedTHVars.Forever_Sales,sellHistory)
    end

现在,我需要找出如何删除当前的重复项,这就是我尝试过的内容。

function table_unique(tt)
  local newtable = {}
  对于ii,xx在ipairs(tt)中做
    如果table_count(newtable.timestampz, xx)〜= tt.timestampz then
      newtable [#newtable + 1] = xx
    end
  end
  返回新行
end

我希望提供的信息是干净和易懂的。

谢谢!

更新

尝试#20;)

对于k,v in pairs(mSavedTHVars.Forever_Sales)做
    如果v == mSavedTHVars.Forever_Sales.timestampz then
      table.remove(mSavedTHVars.Forever_Sales,k)
    end
  end

还没有运气。

更新

这有效

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

这是一个好方法吗?

点赞
用户869951
用户869951

假设 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 就是 mSavedTHVars.Forever_Sales[k],所以下一行 mSavedTHVars.Forever_Sales[k] = v 并没有起到任何作用。然后 if v.timestampz == mSavedTHVars.Forever_Sales.timestampzv 的时间戳,即 mSavedTHVars.Forever_Sales[k] 的时间戳,与 mSavedTHVars.Forever_Sales 中的 timestampz 字段的值进行比较。但是后者是一个没有这样的字段的表格,因此 == 的右侧将是 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

我认为函数的意图也不是很清晰,但这可能只是个人偏好。

2014-04-23 04:33:22