按键排序Lua表

Pra*_*DTI 6 sorting lua key lua-table

我已经经历了很多问题和谷歌搜索结果,但找不到解决方案.

我正在尝试使用table.sortLua中的函数对表进行排序,但我无法弄清楚如何使用它.

我有一个表,其中键是随机数值.我想按升序排序.我也浏览过Lua wiki页面,但table.sort只能使用表值.

t = { [223]="asd", [23]="fgh", [543]="hjk", [7]="qwe" }
Run Code Online (Sandbox Code Playgroud)

我希望它像:

t = { [7]="qwe", [23]="fgh", [223]="asd", [543]="hjk" }
Run Code Online (Sandbox Code Playgroud)

Pau*_*nko 9

您无法设置从哈希(这是您的表所使用的)中检索元素的顺序pairs.您需要从该表中获取密钥,将密钥排序为自己的表,然后使用这些排序的密钥从原始表中检索值:

local t = { [223]="asd", [23]="fgh", [543]="hjk", [7]="qwe" }
local tkeys = {}
-- populate the table that holds the keys
for k in pairs(t) do table.insert(tkeys, k) end
-- sort the keys
table.sort(tkeys)
-- use the keys to retrieve the values in the sorted order
for _, k in ipairs(tkeys) do print(k, t[k]) end
Run Code Online (Sandbox Code Playgroud)

这将打印

7   qwe
23  fgh
223 asd
543 hjk
Run Code Online (Sandbox Code Playgroud)

另一种选择是提供自己的迭代器,而不是pairs按照您需要的顺序迭代表,但是键的排序可能很简单,可以满足您的需求.


vet*_*ham 6

@lhf所说的是正确的,您的lua表以实现可行的顺序保存其内容。但是,如果要以排序的方式打印(或遍历),则可以(因此可以逐个比较它)。为此,您可以按照以下方式进行操作

for key, value in orderedPairs(mytable) do
  print(string.format("%s:%s", key, value))
end
Run Code Online (Sandbox Code Playgroud)

不幸的是,lua的一部分未提供orderedPairs,但是您可以从此处复制实现。


lhf*_*lhf 0

Lua 表中没有顺序的概念:它们只是键值对的集合。

下面的两个表具有完全相同的内容,因为它们包含完全相同的对:

t = { [223] = "asd" ,[23] = "fgh",[543]="hjk",[7]="qwe"}
t = {[7]="qwe",[23] = "fgh",[223] = "asd" ,[543]="hjk"}
Run Code Online (Sandbox Code Playgroud)

  • 手册[说](http://www.lua.org/manual/5.2/manual.html#pdf-next):“没有指定枚举索引的顺序,即使对于数字索引也是如此。” 它甚至可能从程序的一次运行更改为另一次运行。 (3认同)
  • 这怎么算是一个答案呢?无非就是“放弃”而已。 (2认同)