我有以下程序代码,它试图对给定列表进行排序。我尝试了各种选项,但仍然无法正常工作。
local List = {}
List[143] = "143"
List[145] = "145"
List[120] = "120"
List[178] = "178"
table.sort(List, compare)
比较功能定义为
function compare(a, b)
if tonumber(a) < tonumber(b) then
return true
end
end
以上table.sort对任何订单都不起作用。我只想将它排序为增加数字顺序。如果您对此有任何想法,请帮助我。 提前致谢
答案 0 :(得分:12)
table.sort
(以及其余大部分table.*
函数)仅针对类似数组的表的操作定义。这意味着具有来自1..n
的连续整数键的表。你的桌子不符合这些标准。
答案 1 :(得分:3)
该表的键不满足该功能的要求。密钥必须从1开始,并依次按Lua ref manual(“按给定顺序对表格元素进行排序,从table[1]
到table[n]
”按顺序增加到N)。尝试
local List = {}
List[1] = "143"
List[2] = "145"
List[3] = "120"
List[4] = "178"
table.sort(List, compare)
甚至更好
local List = {"143", "145", "120", "178"}
table.sort(List, compare)
答案 2 :(得分:0)
表中的键值对没有稳定的顺序。对于每次运行pairs
或next
函数,您可能会看到不同的键值对序列。 (据推测,由于在表格中添加或删除,序列可能会发生变化。)
除了设置或获取特定键之外,其他表操作使用正整数键。 其他键假设键是连续的。对于这样的表,正整数键可以被认为具有确定的范围并且是有序的,因此排序是有意义的。maxn
获取没有nil值的最大键n。
List
中的正整数键不是连续的。因此,sort
的行为无用(并且通常是非确定性的)。
也许,你想在所有正整数键上做类似这样的操作:
local values = {}
-- extract values from positive integer keys
for key, value in pairs(List)
if (type(key) = "number") and key > 0 then
table.insert(values, value)
List[key] = nil
end
end
-- sort and restore them to the table
table.sort(values, function(a,b) return tonumber(a)<tonumber(b) end)
for key, value in values
List[key] = value
end