试图比较 Lua 中一张表的所有条目

Posted

技术标签:

【中文标题】试图比较 Lua 中一张表的所有条目【英文标题】:Trying to compare all entries of one table in Lua 【发布时间】:2013-02-27 08:09:30 【问题描述】:

基本上我有一个对象表,每个对象都有一个特定的字段,即数字。我正在尝试查看这些数字条目是否匹配,但我想不出办法。我认为可能是一个双循环,一个循环遍历表,另一个递减,但这不会在某些时候导致两个值被比较两次吗?我担心它可能看起来在表面上有效,但实际上有细微的错误。这就是我描绘代码的方式:

for i = #table, 1, -1 do
    for j = 1, #table do
        if( table[i].n == table[j].n ) then
            table.insert(table2, table[i])
            table.insert(table2, table[j])
        end
    end
end

我想将选定的对象(作为表格)插入到另一个预制的没有任何重复的对象中。

【问题讨论】:

【参考方案1】:

让外部循环遍历表格,让内部循环始终在外部元素之前开始一个元素 - 这样可以避免重复计算和将对象与自身进行比较。此外,如果您调用要检查table 的表,这可能会隐藏您要访问inserttable 库。所以假设你调用你的输入表t

for i = 1, #t do
    for j = i+1, #t do
        if( t[i].n == t[j].n ) then
            table.insert(table2, t[i])
            table.insert(table2, t[j])
        end
    end
end

不过,如果三个或更多元素具有相同的值n,您将多次添加其中的一些。您可以使用另一个表格来记住您已经插入了哪些元素:

local done = 
for i = 1, #t do
    for j = i+1, #t do
        if( t[i].n == t[j].n ) then
            if not done[i] then
                table.insert(table2, t[i])
                done[i] = true
            end
            if not done[j] then
                table.insert(table2, t[j])
                done[j] = true
            end
        end
    end
end

我承认这不是很优雅,但是这里已经很晚了,我的大脑拒绝想一个更整洁的方法。

编辑:事实上......使用另一个表,您可以将其减少为一个循环。当您遇到新的n 时,您将在n 添加一个新值作为您的帮助表的键 - 该值将是您刚刚分析的t[i]。如果您遇到表中已经存在的 n,则将保存的元素和当前元素都添加到目标列表中 - 您还可以将辅助表中的元素替换为 true 或其他不是表:

local temp = 
for i = 1, #t do
    local n = t[i].n
    if not temp[n] then
        temp[n] = t[i]
    else
        if type(temp[n]) == "table" then
            table.insert(table2, temp[n])
            temp[n] = true
        end
        table.insert(table2, t[i])
    end        
end

【讨论】:

谢谢!是的,我现在也不太担心优雅。 @user2087398 还是添加了不同的解决方案 ;)

以上是关于试图比较 Lua 中一张表的所有条目的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据库中一张表的全部内容复制到数据库中另一张表中

如何将数据库中一张表的多列映射到类中的一个数组/列表?

[Mysql]备份同库中一张表的历史记录 insert into ..select

怎么备份mysql数据库中一张表

怎样将sqlserver2005数据库中一张表的一半数据取出来

有一个实时监控的项目,现在我想要在C#代码中监测mysql数据库中一张表的更新变化的情况,