Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Lua中如何按表的值对表进行排序?_Arrays_Lua_Lua Table - Fatal编程技术网

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

Arrays 在Lua中如何按表的值对表进行排序?,arrays,lua,lua-table,Arrays,Lua,Lua Table,我有一个由键/值对组成的表: 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) 但这似乎不起作用。。。 谢谢表可以是一组键/值对,也可以是一个数组。好吧,这不完全是真的;一个

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

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)
但这似乎不起作用。。。
谢谢

表可以是一组键/值对,也可以是一个数组。好吧,这不完全是真的;一个表可以是两者,但键/值项与数组项没有关系。也就是说,您可以这样做:

tbl = {
  ['a'] = 1,
  ['b'] = 4,
  [1] = {'a', 1},
  [2] = {'b', 4},
}
tbl[2]
将与
tbl['b']
没有直接关系。您可以执行
tbl[2]=
,它不会影响
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

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

Lua中的表没有任何顺序,因此无法对它们进行排序。只有序列通过数字索引具有隐式顺序,但这是一个解释问题,与表本身无关。
for _, key in ipairs(keys) do
    print(key, mytable[key])
end