【问题标题】:How to compare one value in a table with a list of other values in another table如何将表中的一个值与另一个表中的其他值列表进行比较
【发布时间】:2016-10-12 05:44:30
【问题描述】:

我有两张桌子:

a = {customer1:1234, customer2:3456, customer3:4567, customer4:3456}
b = {2345, 1234, 3456, 6789}

我想知道是否有一种方法可以比较表格以进行匹配。如果否,则该值将被删除。我无法找到一种方法来与值进行一对多比较。

请您告诉我如何实现这一目标?

【问题讨论】:

    标签: lua lua-table


    【解决方案1】:

    您可以使用循环逐元素比较两个表。

    请阅读 Lua 参考资料。

    http://www.lua.org/manual/5.3/manual.html#3.3.4 http://www.lua.org/manual/5.3/manual.html#3.3.5

    简单例子

    local a = {1, 2, 3}
    
    for k, v in pairs(a) do
    
      print(v)
    end
    

    只需用其他东西替换打印。例如,另一个循环遍历第二个表。使用两个嵌套循环允许您将一个表的每个元素与另一个表的所有元素进行比较。你可以为所欲为!

    请注意

    a = {customer1:1234}
    

    会导致脚本错误。将: 替换为=

    【讨论】:

    • 您建议的解决方案将导致 b 的 #a 迭代和 a 的 #b 迭代
    • 我知道。正如我所说,这是一个简单的例子。如果我给他一个完整优化的解决方案,他只会复制而不是学习。
    • 谢谢@Piglet,...会在这里使用您的建议,看看我是否能解决我的问题。
    【解决方案2】:

    假设您想从两个表中删除值,我会采取以下方法:

    1. 迭代a并将其值添加到集合s_a
    2. 迭代b。如果一个值在s_a 中,则将其添加到集合s_b,如果没有从b 中删除。
    3. (可选)s_a = nil; collectgarbage() 释放一些内存
    4. 迭代a 并删除在s_b 中找不到的值

    我的实现:

    local s_a, s_b, iter_b = {}, {}, ipairs(b)
    --starting with b because ipairs is a bit cheaper than pairs if done right
    for k,v in iter_b do
      s_b[v]=true;
    end
    for k,v in pairs(a) do
      if s_b[v] then
        s_a[v]=true
      else
        a[k]=nil
      end
    end
    s_b = nil; collectgarbage()
    for k,v in iter_b do
      if not s_a[v] then b[k] = nil
    end
    

    【讨论】:

    • 你的意思是 ipairs 比 pair 便宜一点?
    • 这是一个错误,但不是真的。我只是记错了一点;由于 ipairs 返回一个无状态迭代器,它可以在多个循环中使用,从而节省了创建新闭包的成本,但这不适用于这种情况,除非您执行类似local iter = ipairs(b) 的操作。我稍后会编辑它。
    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多