如何从Lua表中获取最小值?尝试math.min等方法未成功
解决Lua表中打印最小值的问题
你的原始代码如下:
local test = {10,104,20,1042,1042104,592,502,5940,230952,291} for i, v in pairs(test) do table.sort(test) print(v) end
这段代码里把table.sort放在pairs循环里完全没必要——每次循环都重复排序,而且pairs的遍历顺序不固定,排序后也不会按顺序输出,所以你看到的是乱序打印所有值。
要只打印最小值,给你三种可行的方法:
方法1:排序后取第一个元素
先对表做一次排序,排序后的第一个元素就是最小值,直接打印即可:
local test = {10,104,20,1042,1042104,592,502,5940,230952,291} table.sort(test) -- 仅需排序一次 print(test[1]) -- 输出最小值10
方法2:用math.min配合unpack/table.unpack
math.min需要接收多个数值参数,不能直接传表,所以需要用unpack(Lua5.1版本)或table.unpack(Lua5.3+版本)把表的元素拆成独立参数。如果要兼容不同Lua版本,可以这样写:
local test = {10,104,20,1042,1042104,592,502,5940,230952,291} -- 兼容Lua5.1及更高版本 local min_val = math.min((table.unpack or unpack)(test)) print(min_val)
你之前报错是因为用了table.unpack但Lua版本是5.1,这个版本里unpack是全局函数,不属于table模块,所以会提示“attempt to call field 'unpack' (a nil value)”。
方法3:遍历表找最小值(效率更高)
如果表的元素很多,排序的开销比遍历大,直接遍历一次找最小值更高效:
local test = {10,104,20,1042,1042104,592,502,5940,230952,291} local min_val = test[1] -- 初始化最小值为表的第一个元素 for _, v in ipairs(test) do if v < min_val then min_val = v -- 发现更小值就更新 end end print(min_val)
内容的提问来源于stack exchange,提问作者Brayden Bendrey
相关产品推荐
相关产品推荐

