我在这里查看了其他几个问题,但是它们似乎并没有明确解决我的问题。
我正在尝试根据图像对象的时间戳对图像对象进行排序。在执行此操作时,注意到table.sort没有返回我期望的结果。然后,我创建了以下代码,为清楚起见对其进行了简化,但显示了相同的意外行为。
我的问题是:我在做什么错,以便所有单独的比较都显示正确的true / false值,但最终结果却不是按升序排列?
编辑:我发现将比较直接放在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
答案 0 :(得分:0)
它之前不起作用的原因是您的函数没有返回值,所以它返回了nil
(即不是falsy
)true
。因此,无论碰巧要遍历表的哪个顺序,元素最终都是如何“排序”的。
要解决此问题,您只需将函数更改为return
一个值,即
table.sort(images, function(image1, image2) return comp_time(image1, image2) end)