Как получить наибольшее целое число в таблице в Lua? - PullRequest
4 голосов
/ 03 марта 2011

Как получить наибольшее целое число в таблице в Lua?

Ответы [ 6 ]

13 голосов
/ 03 марта 2011
math.max(unpack({1, 2, 3, 4, 5}))
4 голосов
/ 30 апреля 2013
loltable = {1, 2, 3, 4, 1, 2, 37, 1, 0}
table.sort(loltable)
print(loltable[#loltable])
3 голосов
/ 03 марта 2011

Универсальная функция для достижения этой цели:

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
2 голосов
/ 16 июля 2015

Другой ответ от 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. Возвращает значение последнего элемента (после сортировки оно будет в конце).

Я знаю, что это старый вопрос, поэтому ОП, возможно, в этом больше не нуждается, но эта страница в настоящее время занимает высокое место в Google, поэтому, надеюсь, это поможет кому-то еще, кто наткнется на эту страницу.

1 голос
/ 03 марта 2011

Если ваша таблица является массивом (только числовые индексы> 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])
0 голосов
/ 07 марта 2011

Lua поставляется с функцией для получения максимального целочисленного ключа, если это то, что вы хотели ...

table.maxn
...