【问题标题】:How do I get the highest integer in a table in Lua?如何获得 Lua 表中的最大整数?
【发布时间】:2011-07-07 21:04:12
【问题描述】:

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

【问题讨论】:

    标签: lua integer lua-table


    【解决方案1】:
    math.max(unpack({1, 2, 3, 4, 5}))
    

    【讨论】:

    • 这不适用于较大的表,因为每个 Lua 实现中的参数数量和返回值数量都有限制。
    • math.max() 中是否允许特定数量的参数?这似乎是最“官方”的做事方式。
    【解决方案2】:
    loltable = {1, 2, 3, 4, 1, 2, 37, 1, 0}
    table.sort(loltable)
    print(loltable[#loltable])
    

    【讨论】:

    • 非常简单,完全符合要求。
    【解决方案3】:

    实现此目的的通用函数:

    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”什么的吗?
    • 该函数返回数组中的最大值(及其键),因此称其为“max”比“compare”更有意义。
    【解决方案4】:

    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. 返回最后一个元素的值(排序后会在最后)。

    我知道这是一个老问题,所以 OP 可能不再需要这个了,但是这个页面目前在 Google 上的排名很高,所以希望这可以帮助其他偶然发现这个页面的人。

    【讨论】:

      【解决方案5】:

      如果您的表是一个数组(只有数字索引 >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])
      

      【讨论】:

      • Lua 表索引从 1 开始。
      • 这是对的,也是错的。如果你做t={"a"},那么 t[1] 确实是“a”。但是你可以在任何你想要的地方开始索引,只要你记住其他索引最终会出现在表的散列部分。所以t={[0]=0,1,2,3} 甚至 `t={[-123]="a",[-122]="b",'c'} 都同样有效。但是在这些表上 table.sort 函数将不起作用,因为这仅适用于索引> 0且没有孔的数组。
      • 不应该是:.." at index " ..m[1])?
      • 对,这可能也是 Alexander 的目标……已修复!
      • @jpjacobs,反对m[0] 是由于初始化器m={0,0} 初始化了m[1]m[2]不是 m[0]。这将导致第三行的比较抱怨与nil 比较和整数。
      【解决方案6】:

      Lua 自带一个函数来获取最大整数键,如果那是你想要的...

      table.maxn
      

      【讨论】:

      【解决方案7】:

      你忘记在像这样解压之前添加表格

       local save = math.max(table.unpack({1, 2, 3, 4, 5}))
          print(save)
      

      如果您想找到最大或最小数字,这应该可以工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        • 1970-01-01
        相关资源
        最近更新 更多