lua table.sort未正常排序

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

我试图根据它们的时间戳对图像对象数组进行排序。在这样做时,发现table.sort没有返回我期望的结果。然后我创建了以下代码,它为清晰起见而简化,但显示了相同的意外行为。

我的问题是:我做错了什么,以致于所有单独的比较都显示适当的true / false值,而最终结果不是升序的?

编辑:我发现将比较直接放在table.sort调用内可以解决问题,因此使用外部函数会导致这种不稳定的行为,是否有人能解释一下原因?是否有方法可以缓解这种情况?

  • images = {1,2,4,6,5,3,88,34,8}

  • local function comp_time(first, second) --如果'first'在'second'之前则返回true ret = first < second print(first..' < '..second..' : '..tostring(ret)) return ret end

  • print('未排序:') for i,image in ipairs(images) do print(i..' : '..image) end table.sort(images, function(image1, image2) comp_time(image1, image2) end) print('已排序:') for i,image in ipairs(images) do print(i..' : '..image) end

结果是:

未排序:
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
已排序:
1  :  1
2  :  3
3  :  88
4  :  34
5  :  5
6  :  4
7  :  6
8  :  2
9  :  8
点赞
用户2238176
用户2238176

原因是你的函数没有返回值,所以返回 nil,而 nil 是“假值”(即不为 true)。所以无论表格以什么顺序迭代,元素最终都会以那个顺序“排序”。

要解决这个问题,你只需要改变函数以 return 返回一个值,即:

table.sort(images, function(image1, image2) return comp_time(image1, image2) end)
2019-03-01 04:23:05