我有一个表格,其中填充了用户输入的随机内容。我希望我的用户能够快速搜索此表,并且促进搜索的一种方法是按字母顺序对表进行排序。最初,表格看起来像这样:
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仍然没有被排序。为什么呢?
答案 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
做了我认为的做法......