按键名对 Lua 表进行排序

我浏览了很多问题和谷歌搜索结果,但找不到解决方案。

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

我有一个表,其键是随机数值。 我希望按升序对它们进行排序。 我也浏览了Lua维基页面,但table.sort仅适用于表值。

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

我希望它像这样:

t = { [7]="qwe", [23]="fgh", [223]="asd", [543]="hjk" }
点赞
用户107090
用户107090

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

下面的两个表中包含完全相同的键值对,因此它们包含的内容完全相同:

t = { [223] = "asd" ,[23] = "fgh",[543]="hjk",[7]="qwe"}
t = {[7]="qwe",[23] = "fgh",[223] = "asd" ,[543]="hjk"}
2014-10-02 12:10:48
用户4093928
用户4093928

@lhf 所说的是真的,Lua 表按照实现方式找到的任何顺序来保存它们的内容。但是,如果你想以排序的方式打印(或迭代),这是可能的(这样你可以逐个元素比较它们)。为了实现这一点,可以按照以下方式操作:

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

不幸的是,Lua 没有提供 orderedPairs 函数,但你可以从 [这里](http://lua-users.org/wiki/SortedIteration)复制实现。

2014-10-02 13:28:22
用户1442917
用户1442917

你不能使用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

另一个选择是提供你自己的迭代器来迭代表,以你需要的顺序,但是排序键可能足够简单以满足你的需求。

2014-10-02 17:50:50
用户1624512
用户1624512

Lua sort文档提供了一个好的解决方案

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      -- 迭代器变量
    local iter = 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
2021-11-24 13:21:48