Lua - 对表进行按字母顺序排序

我有一个表格,里面填满了用户输入的随机内容。我希望用户能够快速搜索这张表格,一个方便他们的搜索方式就是按字母顺序排序表格。最初,表格长这样:

myTable = {
    Zebra = "black and white",
    Apple = "I love them!",
    Coin = "25cents"
}

我可以实现一个 pairsByKeys() 函数,让我能够按字母顺序输出表格的内容,但不能以这种方式 存储 它们。因为搜索设置的方式,表格本身需要按字母顺序排列。

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

后来我明白了(也许是不正确的,请您告诉我)非数值索引的表格无法按字母顺序排序。所以我开始想绕过这个问题的方法——一种我想到的方法是先排序表格,然后将每个值放到一个数值索引的数组中,类似下面这样:

myTable = {
    [1] = { Apple = "I love them!" },
    [2] = { Coin = "25cents" },
    [3] = { Zebra = "black and white" },
}

原则上,我觉得这应该行得通,但出于某些原因,我在用它时遇到了困难。我的表格似乎没有被排序。这是我用上述函数来排序的方法:

SortFunc = function ()
    local newtbl = {}
    local t = {}
    for title,value in pairsByKeys(myTable) do
        newtbl[title] = value
        tinsert(t,newtbl[title])
    end
    myTable = t
end

我的表格仍然没有被排序。为什么?

原文链接 https://stackoverflow.com/questions/1146686

点赞
stackoverflow用户108130
stackoverflow用户108130

Lua 的表(table)可以是混合的。对于数字键,从 1 开始,它使用一个向量(vector),而对于其他键它使用一个哈希(hash)。

例如,{1="foo", 2="bar", 4="hey", my="name"}

1 和 2 将被放在一个向量中,4 和 my 将被放在一个哈希表中。4 打破了序列,这就是将它包含在哈希表中的原因。

有关如何对 Lua 的表进行排序的信息,请查看这里:19.3 - Sort

2009-07-18 04:29:08
stackoverflow用户41661
stackoverflow用户41661

你的新表需要连续的整数键,并且需要值本身是表。因此你需要以下格式的东西:

SortFunc = function (myTable)
    local t = {}
    for title,value in pairsByKeys(myTable) do
        table.insert(t, { title = title, value = value })
    end
    myTable = t
    return myTable
end

这假设 pairsByKeys 做我所想的...

2009-07-18 20:20:21