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

问题描述 投票:1回答:2

我有一个包含键/值对的表:

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)

但是那似乎没有用...谢谢

arrays lua lua-table
2个回答
0
投票

表要么是一组键/值对,要么是一个数组。好吧,那不是完全正确的。一个表可以是两个表,但是键/值条目将与数组条目无关。也就是说,您可以执行以下操作:

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

0
投票

“编程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
© www.soinside.com 2019 - 2024. All rights reserved.