lua table.sort没有正确排序

问题描述 投票:1回答:1

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

我试图根据时间戳对图像对象数组进行排序。这样做时注意到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
lua
1个回答
0
投票

它之前没有工作的原因是你的函数没有返回一个值,所以它返回nil,这是falsy(即它不是true)。因此,表格碰巧迭代的顺序是元素如何最终被“排序”。

要解决这个问题,你只需要将你的函数更改为return一个值,即

table.sort(images, function(image1, image2) return comp_time(image1, image2) end)
© www.soinside.com 2019 - 2024. All rights reserved.