Как отсортировать таблицу по значениям в Lua? - PullRequest
2 голосов
/ 11 октября 2019

У меня есть таблица, состоящая из пар ключ / значение:

mytable[a] = 1, 
mytable[b] = 4, 
mytable[r] = 7, 
mytable[f] = 2,

и т. Д.

Я хочу отсортировать таблицу по номерам. Поэтому я хотел бы, чтобы таблица была {(a, 1), (f, 2), (b, 4), (r, 7)}, я пытался использовать

table.sort(mytable, function(a, b) return a[2] > b[2] end)

, но этоне похоже на работу ... Спасибо

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Один из способов, который предлагается в «Программирование Lua» (я не помню, где именно), - это извлечь ключи в отдельную последовательность, затем отсортировать последовательность и использовать полученную отсортированную последовательность для индексации в исходной таблице. Пример:

keys = {}

for key, _ in pairs(mytable) do
    table.insert(keys, key)
end

table.sort(keys, function(keyLhs, keyRhs) return mytable[keyLhs] < mytable[keyRhs] end)

Затем вы можете перебрать ключи для получения соответствующих значений:

for _, key in ipairs(keys) do
    print(key, mytable[key])
end
2 голосов
/ 11 октября 2019

Таблица представляет собой набор пар ключ / значение или массив. ОК, это не совсем так;таблица может быть и другой, но записи ключ / значение не будут иметь отношения к записям массива. То есть вы можете сделать это:

tbl = {
  ['a'] = 1,
  ['b'] = 4,
  [1] = {'a', 1},
  [2] = {'b', 4},
}

tbl[2] не будет иметь прямого отношения к tbl['b']. Вы можете выполнить tbl[2] = <anything>, и это не повлияет на содержимое tbl['b'].

Пока таблица не изменится, вы можете взять любую чистую таблицу ключ / значение и построить массивчасть этого, которую вы можете затем отсортировать по своему усмотрению. Вот функция, которая делает это:

local function build_array(tbl)
  --We cannot modify `tbl` while iterating through it, so build a temp array.
  local arr = {}
  for key, value in pairs(tbl) do
    arr[#arr + 1] = {key, value}
  end

  for ix, value in ipairs(arr) do
    tbl[ix] = value
  end

  return tbl
end
...