lua table.sort排序不正确

时间:2019-02-28 17:05:27

标签: lua

我在这里查看了其他几个问题,但是它们似乎并没有明确解决我的问题。

我正在尝试根据图像对象的时间戳对图像对象进行排序。在执行此操作时,注意到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

1 个答案:

答案 0 :(得分:0)

它之前不起作用的原因是您的函数没有返回值,所以它返回了nil(即不是falsytrue。因此,无论碰巧要遍历表的哪个顺序,元素最终都是如何“排序”的。

要解决此问题,您只需将函数更改为return一个值,即

table.sort(images, function(image1, image2) return comp_time(image1, image2) end)