如何使用 Lua 获得 Table 中的最小数字
How to get the smallest number in a Table with Lua
我不擅长编程并且是 Lua 的新手。有人可以帮助解释我应该做的事情的逻辑吗?我有一个 Table 填充了值,需要 return 最小值,在本例中为 -9。我知道我需要使用 math.min
,但不确定如何正确使用它。这是我正在使用的代码的简化版本,但我试图找出基础知识,所以我希望自己能完成剩下的工作。任何帮助表示赞赏。谢谢。
例如:
local test_1 = {2, 7, -9, 0, 27, 36, 16}
function min()
print(math.min(test_1))
end
min()
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
向函数传递参数时,传递的参数是那些表达式列表之一。
类似数组的 table 与 {2, 7, -9, 0, 27, 36, 16}
是 而非 相同的东西。相反,它是 table 类型的单个表达式的列表。您可以通过用逗号分隔来制作 table 的列表。例如:
local arr1, arr2, arr3 = {2, 7, -9, 0, 27, 36, 16}, {0,1}, {5,6,7}
unpack
函数(在某些版本的 Lua 中它位于 table.unpack
中)将类似数组的 table 转换为值列表。
local x,y,z = unpack({1,2,3})
print(x) -- 1
结合这三件事,你最终得到我在开头给你的 1-liner:
print(math.min(unpack({2,7,-9,27,36,16})))
编辑:@Piglet 的评论是正确的。一个函数可以接受的参数数量是有限制的,所以如果传递的 table 有太多元素,我基于 unpack
的解决方案就会失败。参数的最大数量似乎取决于您如何编译 Lua,但通常可以安全地假设它在“小于 50”时工作正常。如果您的 table 可以拥有超过 50 个项目,请改用他基于 for
的解决方案。
kikito 的解决方案是有限的。对于具有数千个元素的大 tables,它将失败,因为 Lua 无法解压太多值。
这是直接的解决方案。遍历table,记住最小值
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 升序排序。你的第一个元素是最小值。
table.sort(test_1)
print(test_1[1])
我不擅长编程并且是 Lua 的新手。有人可以帮助解释我应该做的事情的逻辑吗?我有一个 Table 填充了值,需要 return 最小值,在本例中为 -9。我知道我需要使用 math.min
,但不确定如何正确使用它。这是我正在使用的代码的简化版本,但我试图找出基础知识,所以我希望自己能完成剩下的工作。任何帮助表示赞赏。谢谢。
例如:
local test_1 = {2, 7, -9, 0, 27, 36, 16}
function min()
print(math.min(test_1))
end
min()
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
向函数传递参数时,传递的参数是那些表达式列表之一。
类似数组的 table 与 {2, 7, -9, 0, 27, 36, 16}
是 而非 相同的东西。相反,它是 table 类型的单个表达式的列表。您可以通过用逗号分隔来制作 table 的列表。例如:
local arr1, arr2, arr3 = {2, 7, -9, 0, 27, 36, 16}, {0,1}, {5,6,7}
unpack
函数(在某些版本的 Lua 中它位于 table.unpack
中)将类似数组的 table 转换为值列表。
local x,y,z = unpack({1,2,3})
print(x) -- 1
结合这三件事,你最终得到我在开头给你的 1-liner:
print(math.min(unpack({2,7,-9,27,36,16})))
编辑:@Piglet 的评论是正确的。一个函数可以接受的参数数量是有限制的,所以如果传递的 table 有太多元素,我基于 unpack
的解决方案就会失败。参数的最大数量似乎取决于您如何编译 Lua,但通常可以安全地假设它在“小于 50”时工作正常。如果您的 table 可以拥有超过 50 个项目,请改用他基于 for
的解决方案。
kikito 的解决方案是有限的。对于具有数千个元素的大 tables,它将失败,因为 Lua 无法解压太多值。
这是直接的解决方案。遍历table,记住最小值
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 升序排序。你的第一个元素是最小值。
table.sort(test_1)
print(test_1[1])