Lua中如何按表中的值对表进行排序?

我有一个由键值对组成的表:

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)

但似乎没什么作用... 谢谢

点赞
用户734069
用户734069

一个表可以是一组键/值对或一个数组。好吧,这并不完全正确;一个表也可以同时兼备键/值对和数组的特性,但键/值对的条目与数组的条目没有关联。也就是说,你可以这样做:

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)
  -- 我们不能在迭代表的同时修改 `tbl`,所以我们要建立一个临时数组。
  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
2019-10-11 05:39:46
用户9593596
用户9593596

一个在《编程 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
2019-10-11 07:35:54