Lua表按键排序

15

我查阅了许多问题和谷歌搜索结果,但找不到解决方案。

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

我的表具有随机数值的键。 我想按升序对它们进行排序。 我也查看了Lua wiki页面,但是table.sort仅适用于表值。

t = { [223]="asd", [23]="fgh", [543]="hjk", [7]="qwe" }

I want it like:

t = { [7]="qwe", [23]="fgh", [223]="asd", [543]="hjk" }

1
你真正想要解决什么问题? - lhf
不要混淆_table constructor_(它具有可选键的有序值列表——源代码概念)和 _actual table_(运行时数据结构)。表构造器中的顺序仅与隐式键的赋值相关。 - Tom Blodget
回到“你真正想解决的问题是什么?”你似乎想要存储或使用比代码中拥有的更多的信息/结构。请解释一下目标。可能是你想要一个迭代器。也可能是你想要一个不同的表结构。... - Tom Blodget
4个回答

28

使用 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

这将打印出来。
7   qwe
23  fgh
223 asd
543 hjk

另一个选项是提供自己的迭代器来代替pairs,以按照您需要的顺序迭代表格,但是键的排序可能足够简单以满足您的需求。


7

@lhf所说的是正确的,你的lua表格将其内容存储在任何实现可行的顺序中。然而,如果你想以排序的方式打印(或遍历)它,则可以做到这一点(以便逐个元素进行比较)。为了实现这一点,您可以按以下方式进行操作:

for key, value in orderedPairs(mytable) do
  print(string.format("%s:%s", key, value))
end

很遗憾,orderedPairs不是lua的一部分,但你可以从这里复制实现。


2
这句话的意思是:“Lua sort docs 提供了一个很好的解决方案。”
local function pairsByKeys (t, f)
    local a = {}
    for n in pairs(t) do table.insert(a, n) end
    table.sort(a, f)
    local i = 0      -- iterator variable
    local iter = function ()   -- iterator function
        i = i + 1
        if a[i] == nil then return nil
        else return a[i], t[a[i]]
        end
    end
    return iter
end

然后您遍历已排序的结构。
local t = { b=1, a=2, z=55, c=0, qa=53, x=8, d=7 }
for key,value in pairsByKeys(t) do
    print("  " .. tostring(key) .. "=" .. tostring(value))        
end

0
Lua表中没有顺序的概念:它们只是键值对的集合。
下面的两个表格具有完全相同的内容,因为它们包含完全相同的键值对:
t = { [223] = "asd" ,[23] = "fgh",[543]="hjk",[7]="qwe"}
t = {[7]="qwe",[23] = "fgh",[223] = "asd" ,[543]="hjk"}

你说得没错,但我们能把键设置为升序吗?因为当我比较这两个表时,结果会不同,因为我比较的第一对键值对是t[223]和[7]。如果这两个表都按升序排列,那么我就可以轻松找到缺失的键。 - Prakash.DTI
3
手册中写道:“即使是数字索引,枚举索引的顺序也没有指定。”甚至在程序的不同运行中,顺序可能会发生变化。 - lhf
2
这怎么算是一个答案呢?这只是“放弃”而已。 - feos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接