Lua - 按字母顺序排序表

时间:2009-07-18 04:07:50

标签: sorting lua

我有一个表格,其中填充了用户输入的随机内容。我希望我的用户能够快速搜索此表,并且促进搜索的一种方法是按字母顺序对表进行排序。最初,表格看起来像这样:

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

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

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

myTable仍然没有被排序。为什么呢?

2 个答案:

答案 0 :(得分:3)

Lua的可以是混合的。对于数字键,从1开始,它使用向量,对于其他键,它使用哈希

例如,{1="foo", 2="bar", 4="hey", my="name"}
1& 2,将被放置在矢量,4&我将被放在哈希表中。 4 打破了序列,这就是将其包含在哈希表中的原因。

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

答案 1 :(得分:2)

您的新表需要连续的整数键,并且需要将值本身作为表。所以你想要这个订单上的东西:

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做了我认为的做法......