我在这里看了几个其他的问题,但他们似乎没有明确地解决我的问题。
我试图根据时间戳对图像对象数组进行排序。这样做时注意到table.sort没有返回我预期的结果。然后我创建了以下代码,为了清晰起见,这些代码被简化,但显示了相同的意外行
我的问题是:我做错了什么,以便所有个别比较显示正确的真/假值,但最终结果不是按升序排列?
编辑:我发现直接在table.sort调用中放置比较解决了这个问题,因此看起来使用外部函数会导致这种不稳定的行为,任何人都可以解释原因吗?有没有办法减轻这种情况?
images = {1,2,4,6,5,3,88,34,8}
local function comp_time(first, second) --returns true if 'first' was taken before 'second'
ret = first < second
print(first..' < '..second..' : '..tostring(ret))
return ret
end
print('unsorted:')
for i,image in ipairs(images) do
print(i..' : '..image)
end
table.sort(images, function(image1, image2) comp_time(image1, image2) end)
print('sorted:')
for i,image in ipairs(images) do
print(i..' : '..image)
end
结果是:
unsorted:
1 : 1
2 : 2
3 : 4
4 : 6
5 : 5
6 : 3
7 : 88
8 : 34
9 : 8
8 < 1 : false
5 < 1 : false
8 < 5 : false
2 < 5 : true
5 < 88 : true
4 < 5 : true
5 < 3 : false
6 < 5 : false
5 < 34 : true
6 < 5 : false
5 < 34 : true
8 < 4 : false
2 < 4 : true
8 < 2 : false
6 < 2 : false
2 < 6 : true
2 < 2 : false
2 < 4 : true
6 < 4 : false
34 < 1 : false
88 < 1 : false
34 < 88 : true
3 < 88 : true
88 < 3 : false
88 < 88 : false
88 < 1 : false
3 < 1 : false
sorted:
1 : 1
2 : 3
3 : 88
4 : 34
5 : 5
6 : 4
7 : 6
8 : 2
9 : 8
它之前没有工作的原因是你的函数没有返回一个值,所以它返回nil
,这是falsy
(即它不是true
)。因此,表格碰巧迭代的顺序是元素如何最终被“排序”。
要解决这个问题,你只需要将你的函数更改为return
一个值,即
table.sort(images, function(image1, image2) return comp_time(image1, image2) end)