如何根据 Lua 中的值对 table 进行排序?

How to sort a table by its values in Lua?

我有一个 table 由 key/value 对组成:

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

等等

我想按数字对 table 进行排序。所以我希望 table 是 {(a, 1), (f, 2), (b, 4), (r, 7)} 我试过使用

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

但这似乎没有用... 谢谢

A table 要么是一组 key/value 对,要么是一个数组。好吧,这不完全正确; table 可以是两者,但 key/value 条目与数组条目没有关系。也就是说,你可以这样做:

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

tbl[2]tbl['b'] 没有直接关系。可以执行tbl[2] = <anything>,对tbl['b']的内容没有影响。

只要 table 不变,您可以采用任何纯 key/value table 并构建它的数组部分,然后您可以根据需要对其进行排序.这是一个函数:

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

"Programming Lua"中建议的一种方法(我不记得具体在哪里)是将键提取到一个单独的序列中,然后对序列进行排序,并使用生成的排序序列索引到原文table。示例:

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