【问题标题】:How to get the smallest number in a Table with Lua如何使用 Lua 获取表格中的最小数字
【发布时间】:2021-11-20 09:02:09
【问题描述】:

我不擅长编程并且是 Lua 新手。有人可以尽可能简单地解释我应该做什么的逻辑吗?我有一个填充了值的表,需要返回最小值,在本例中为 -9。我知道我需要使用math.min,但不确定如何正确使用它。这是我正在使用的代码的简化版本,但试图弄清楚基础知识,以便我可以自己完成其余的工作。任何帮助表示赞赏。谢谢。

例如:

local test_1 = {2, 7, -9, 0, 27, 36, 16}

function min()
    print(math.min(test_1))
end

min()

【问题讨论】:

    标签: arrays lua


    【解决方案1】:

    kikito 的解决方案是有限的。对于包含数千个元素的大表,它将失败,因为 Lua 无法解压缩太多值。

    这是直接的解决方案。遍历表格并记住最小值。

    local min = math.huge
    for i = 1, #test_1  do
      min = min < test_1[i] and min or test_1[i]
    end
    print(min)
    

    由于函数调用有点慢

    for i,v in ipairs(test_1) do
      min = math.min(min, v)
    end
    print(min)
    

    也可以,但速度较慢,按升序对表格进行排序。你的第一个元素是最小值。

    table.sort(test_1)
    print(test_1[1])
    

    【讨论】:

    • 在大表中,您可以在 table.unpack 给出的 slices 上调用 math.min,它接受开始和结束索引。
    • @lhf thx 我总是忘记这一点。与普通迭代相比,是否有任何性能提升?我想要一些东西来换取更复杂的代码:)
    • 我不知道。我没有做过任何基准测试
    【解决方案2】:
    print(math.min(unpack({2,7,-9,27,36,16})))
    

    解释:

    math.min 接受可变参数 - 如果你给它 n 个参数,它会给你最小的一个:

    print(math.min(3,2,1))        -- prints 1
    print(math.min(3,2,1,0,-1,-2) -- prints -2
    

    在 Lua 中,您可以拥有“独立的逗号分隔的表达式列表”。可能最简单的方法是在为多个变量分配多个值时查看它们:

    local x,y,z = 1,2,3 -- 1,2,3 is a comma-separated list of values
    print(x) -- prints 1
    

    将参数传递给函数时,您传递的参数是那些表达式列表之一。

    {2, 7, -9, 0, 27, 36, 16} 这样的类数组表是一回事。相反,它是表类型的单个表达式的列表。您可以通过用逗号分隔表格来制作表格列表。例如:

    local arr1, arr2, arr3 = {2, 7, -9, 0, 27, 36, 16}, {0,1}, {5,6,7}
    

    unpack 函数(在某些版本的 Lua 中,它位于 table.unpack 内部)将类似数组的表转换为值列表。

    local x,y,z = unpack({1,2,3})
    print(x) -- 1
    

    结合这三件事,你最终得到了我一开始给你的 1-liner:

    print(math.min(unpack({2,7,-9,27,36,16})))
    

    编辑:@Piglet 的评论是正确的。函数可以接受的参数数量是有限制的,所以如果传递的表有太多元素,我的基于unpack 的解决方案将失败。似乎参数的最大数量取决于你如何编译 Lua,但一般来说,假设它在“小于 50”时可以正常工作似乎是安全的。如果您的表可以有超过 50 个项目,请改用他的基于 for 的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 2020-04-28
      • 2021-02-06
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2011-02-11
      相关资源
      最近更新 更多