如何使用Lua获取表中最小的数字

use*_*403 4 arrays lua

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

例如:

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

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

min()
Run Code Online (Sandbox Code Playgroud)

Pig*_*let 10

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)
Run Code Online (Sandbox Code Playgroud)

由于函数调用,速度有点慢

for i,v in ipairs(test_1) do
  min = math.min(min, v)
end
print(min)
Run Code Online (Sandbox Code Playgroud)

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

table.sort(test_1)
print(test_1[1])
Run Code Online (Sandbox Code Playgroud)


kik*_*ito 5

print(math.min(unpack({2,7,-9,27,36,16})))
Run Code Online (Sandbox Code Playgroud)

解释:

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

print(math.min(3,2,1))        -- prints 1
print(math.min(3,2,1,0,-1,-2) -- prints -2
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

local arr1, arr2, arr3 = {2, 7, -9, 0, 27, 36, 16}, {0,1}, {5,6,7}
Run Code Online (Sandbox Code Playgroud)

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

local x,y,z = unpack({1,2,3})
print(x) -- 1
Run Code Online (Sandbox Code Playgroud)

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

print(math.min(unpack({2,7,-9,27,36,16})))
Run Code Online (Sandbox Code Playgroud)

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