Lua表格排序无效

5

我有下面的程序代码,它试图对给定的列表进行排序。我尝试了各种选项,但仍然无法正常工作。

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无法按任何顺序排序。我只想按数字递增的顺序排序。如果您有任何想法,请帮助我。 提前致谢。

3
你的示例已经排好序了,你希望键或值被排序?请参见http://www.lua.org/pil/19.3.html。 - Dmitry Ledentsov
3
您的比较函数可以简化为return tonumber(a) < tonumber(b) - Ryan Stein
1
排序意味着重新排列由一组有序键引用的值。您打算使用哪些键?或者更具体地说,您在示例中期望的结果是什么? - Tom Blodget
3个回答

12

table.sort(以及table.*函数的大部分)仅适用于类似数组的表上的操作。这意味着具有从1..n连续整数键的表。您的表不符合这些标准。


3
Lua参考手册table[1]table[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)
的键不满足该函数的要求。按照(“在给定顺序下对表元素进行原地排序,从到”)的规定,键必须从1开始顺序递增至N。请尝试修改键以满足此要求。甚至更好

0

表中的键值对没有稳定的顺序。每次使用 pairsnext 函数遍历时,您可能会看到不同顺序的键值对。(假设该顺序可能因添加或删除表项而改变。)

除了设置或获取特定键之外,其他表操作使用正整数键。 maxn 获取最大键 n,该键没有 nil 值。 其他操作假定键是连续的。对于这样的表,正整数键可以被认为具有明确的范围,并且按顺序排序是有意义的。

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

这不是现代Lua... 至少需要写成for key,value in pairs(List),而且.maxn字段通常在Lua 5.1及更高版本中不存在。 - RBerteig
谢谢。我的意思是调用“pairs”。在5.1中,“maxn”是有效的,但在5.2中不是。 - Tom Blodget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接