Lua排序。sort排序后的怪异顺序

crdsClear={{y=56,x=50,symbolName=3,},
{y=56,x=29,symbolName=2,},
{y=56,x=99,symbolName=2,},
{y=56,x=9,symbolName=5,},
{y=56,x=69,symbolName=5,},
{y=56,x=19,symbolName=4,},
{y=56,x=59,symbolName=4,},
{y=56,x=89,symbolName=4,},
{y=56,x=40,symbolName=7,},
{y=56,x=80,symbolName=6,},}

tmp2={}
ywf = 1
table.sort(crdsClear,
    function(a,b)
        tmp2[ywf]=""
        for i=1, #crdsClear, 1 do tmp2[ywf] = tmp2[ywf].."\t"..crdsClear[i].x     end
        ywf = ywf + 1
        if  a.x <= b.x then print(a.x.." <= "..b.x.." true") else print(a.x.." <= "..b.x.." false") end
        return a.x <= b.x --  a.y <= b.y and
    end
)

-- 创建字符串
order=""
print(#crdsClear)
result = {[1]=""}
for i=1, #crdsClear, 1 do
    order = order..crdsClear[i].x.." "
    result[1] = result[1].. crdsClear[i].symbolName
end
print(order)
print(result[1])

sort排序后我有一个.x顺序:

9 19 59 29 40 50 69 80 89 99

和字符串:

5442735642

为什么我有不正确的顺序?

如果我改变:

return a.x <= b.x

to:

return a.x < b.x

然后正确地排序。

点赞
用户2858170
用户2858170

从 Lua 参考手册:

如果给定了 comp,则它必须是一个函数,该函数接收两个列表元素并在最终顺序中第一个元素必须在第二个元素之前返回 true(因此,在排序后,i < j 意味着不是 comp(list[j],list[i]) )。

这里使用 <= 会导致无效的排序函数,在某些情况下会调用错误消息和/或不完整的排序结果。

请改用 return a.x < b.x

2017-09-18 11:10:16