按时间戳从LUA表中删除重复项
几天前,我在stack上寻求帮助插入记录以防止重复。然而,进入这些系统的过程很慢,它们会溜进系统 我有大约10000名玩家的用户群,他们有重复的条目。。我一直试图过滤掉这些重复的内容,但没有成功。堆栈上的示例对我来说没有详细说明 这是我桌子上的一个夹子按时间戳从LUA表中删除重复项,lua,lua-table,deduplication,Lua,Lua Table,Deduplication,几天前,我在stack上寻求帮助插入记录以防止重复。然而,进入这些系统的过程很慢,它们会溜进系统 我有大约10000名玩家的用户群,他们有重复的条目。。我一直试图过滤掉这些重复的内容,但没有成功。堆栈上的示例对我来说没有详细说明 这是我桌子上的一个夹子 [18] = { ["soldAmount"] = 25, ["buyer"] = [[@playername]],
[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 mSavedTHVars.Forever_Sales[k] = v
if v.timestampz == mSavedTHVars.Forever_Sales.timestampz then
table.remove(mSavedTHVars.Forever_Sales, k)
end
end
这是一个好方法吗 假设
mSavedTHVars.Forever\u Sales[18]
和mSavedTHVars.Forever\u Sales[19]
是您在帖子中列出的表,那么要删除基于同一时间戳的所有重复项,最简单的方法是基于时间戳创建一个“集合”(因为时间戳是唯一性的条件)。循环浏览您的mSavedTHVars.Forever\u 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
问题是我不明白这是怎么回事。当你对k做时,v成对(mSavedTHVars.Forever\u Sales)做
然后v
就是mSavedTHVars.Forever\u Sales[k]
所以下一行mSavedTHVars.Forever\u Sales[k]=v
什么都不做。然后如果v.timestampz==mSavedTHVars.Forever\u Sales.timestampz
将v
的时间戳,即mSavedTHVars.Forever\u Sales[k]
的时间戳与mSavedTHVars.Forever\u Sales
中的timestampz
字段的值进行比较。但后者是一个没有此类字段的表,所以=
的右侧将为nil,因此只有当v.timestampz
为nil时,该条件才为真,我认为永远不会是这样
我使用创建新表而不是从现有表中删除重复项的解决方案的主要原因是,您可以在使用pairs或ipair对表进行迭代的同时对其进行编辑。如果您使用反向计数器,它可能是可以的(但我还没有测试,请测试以确保):
我也认为这个功能的意图不是很清楚,但也许这只是个人喜好 我在上面添加了一个更新,看起来很有效。这看起来是个好方法吗?@WilliamRussell不,我整理了我的答案,因为我意识到尝试我讨论的前两个解决方案没有意义,只是最后一个是最好的,我希望这是你接受的解决方案。谢谢,这似乎也行得通。从这个功能和我上面的更新中,你认为会有什么不同(或者对我有什么伤害)--编辑我计划使用你的。。。只是curious@WilliamRussell我扩展了我的答案来讨论您提出的解决方案,并给出了使用remove而不是newtableinsert的替代方案。
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
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