如何在Lua中获取表格中最大的整数?

10
如何在Lua中获取表中的最高整数?
7个回答

27
在Lua 5.1及更早版本中,您可以使用
math.max(unpack({1, 2, 3, 4, 5}))

这受限于Lua栈的大小;在PUC Lua 5.1上,如果栈是空闲的(即尚未进行函数调用),则最多可获取约8千个数字的最大值。

自Lua 5.2以来,您必须使用table.unpack而不是unpack(它已被移动)。栈大小已经大幅增加,因此可以使用此方法找到数十万个数字的最大值。


5
对于更大的表格,这种方法不适用,因为在每个Lua实现中,参数数量和返回值数量都有限制。 - Alexander Gladysh
在math.max()函数中是否有特定数量的参数限制?它似乎是最"正式"的做事方式。 - Jeremy

8
一个通用的函数来实现这个功能:
function max(t, fn)
    if #t == 0 then return nil, nil end
    local key, value = 1, t[1]
    for i = 2, #t do
        if fn(value, t[i]) then
            key, value = i, t[i]
        end
    end
    return key, value
end

这是如何使用的:

print(max({1,2,3,4,1,2,37,1,0}, function(a,b) return a < b end)) --> 7 37

为什么这个函数被称为“max”,难道不应该叫做“compare”或其他什么吗? - Peter Raeves
该函数返回数组中的最大值(及其键),因此将其称为“max”而不是“compare”更有意义。 - Fornost

8
loltable = {1, 2, 3, 4, 1, 2, 37, 1, 0}
table.sort(loltable)
print(loltable[#loltable])

1
非常简单,完全按照要求执行。 - nehegeb

5

ponzao的另一个答案不错,但更具体地回答您的问题,如果您只想获取最高数(而不是索引),我通常会这样做:

function max(a)
  local values = {}

  for k,v in pairs(a) do
    values[#values+1] = v
  end
  table.sort(values) -- automatically sorts lowest to highest

  return values[#values]
end

print(max({1, 2, 3, 4, 1, 2, 37, 1, 0})) --> 37

为了更进一步,只包括表格的数组部分并过滤出仅为数字值(以防止错误),您可以添加一些类型检查:
function max(a)
  local values = {}

  for k,v in pairs(a) do
    if type(k) == "number" and type(v) == "number" then
      values[#values+1] = v
    end
  end
  table.sort(values) -- automatically sorts lowest to highest

  return values[#values]
end

print(max({1, 2, 3, 4, 1, 2, 37, 1, 0})) --> 37

逻辑如下:
  1. 创建一个空表(数组)
  2. 通过键值对迭代所有键(ipairs()将停止在第一个nil处,使用for循环和#也是如此)
  3. 将每个值添加到数组中(在第二个代码块中验证类型后)
  4. 将数组从高到低排序
  5. 返回最后一个元素的值(经过排序后,它将位于末尾)。
我知道这是一个旧问题,所以楼主可能不再需要了,但是这个页面目前在谷歌排名较高,所以希望这篇翻译能帮助其他遇到这个问题的人。

2
如果你的表是一个数组(只有数字索引> 0),那么请使用table.sort并获取t[#t](但这会改变表格)。
另一种方法如下:
m={0,0}
for k,v in pairs(t) do
    if m[1]<v then
         m[1]=v
         m[2]=k
    end
end
print("Maximum of "..m[1].." at index "..m[2])

1
Lua表的索引从1开始。 - Alexander Gladysh
这是真的,同时也是假的。如果你执行t={"a"},那么t[1]确实是"a"。但是你可以从任何位置开始索引,只要记住其他索引最终会出现在表的哈希部分中。所以t={[0]=0,1,2,3}或者甚至是t={[-123]="a",[-122]="b",'c'}同样有效。但是对于这些表,table.sort函数将无法工作,因为它仅适用于索引>0且没有空洞的数组。 - jpjacobs
难道不应该是:.." at index " ..m[1])吗? - quinmars
@jpjacobs,对m[0]的反感是由于初始化程序m={0,0}导致的,该初始化程序已经初始化了m[1]m[2],但是没有初始化m[0]。这将导致第三行的比较抱怨用nil来比较整数。 - RBerteig
此解决方案假设表中仅存储正值。 - Wojciech
显示剩余2条评论

2
Lua自带一个函数,用于获取最高的整数键(如果这正是你想要的...)。
table.maxn

2
从Lua 5.2开始,table.maxn已被弃用。 - legends2k

2
您忘记在 unpack 前面添加表格,像这样:
 local save = math.max(table.unpack({1, 2, 3, 4, 5}))
    print(save)

如果你想查找最大或最小数,这段代码应该能够正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接