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

Posted

技术标签:

【中文标题】如何按 Lua 中的值对表进行排序?【英文标题】:How to sort a table by its values in Lua? 【发布时间】:2020-02-08 14:18:46 【问题描述】:

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

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)

但这似乎不起作用... 谢谢你

【问题讨论】:

Lua 中的表没有任何顺序,因此您无法对它们进行排序。只有序列通过其数字索引具有隐式顺序,但这是一个解释问题,与表本身无关。 【参考方案1】:

表要么是一组键/值对,要么是一个数组。好吧,这并不完全正确。一个表可以是两者,但键/值条目与数组条目没有关系。也就是说,您可以这样做:

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

【讨论】:

【参考方案2】:

“Programming 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

【讨论】:

以上是关于如何按 Lua 中的值对表进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何按对象中的值对数组进行排序

如何按字典中的值对字典列表进行排序? [复制]

在 Symfony2 中按多个值对数据库中的记录进行排序

如何按创建 UITableViewCell 时计算的值对 UITableView 进行排序?

在 Lua 中对表 [] 进行排序

如何按给定键的值对关联数组进行排序并在php中维护键? [复制]