大多数惯用的排序方式,然后在lua中子句嵌套表?

时间:2014-03-22 14:41:34

标签: sorting lua

我有一个包含9个{x,y}点的表格,我想先用y排序,然后用x排序。可能是我目前的代码最好的解释:

coords = {{135, 487}, {135, 298}, {334, 308}, {334, 485}, {554, 301}, {555, 400}, {136, 97}, {334, 98}, {552, 107}}

table.sort(coords, function(a, b) return b[2] > a[2] end)
t1 = {}
table.insert(t1, coords[1])
table.insert(t1, coords[2])
table.insert(t1, coords[3])
t2 = {}
table.insert(t2, coords[4])
table.insert(t2, coords[5])
table.insert(t2, coords[6])
t3 = {}
table.insert(t3, coords[7])
table.insert(t3, coords[8])
table.insert(t3, coords[9])
table.sort(t1, function(a, b) return b[1] > a[1] end)
table.sort(t2, function(a, b) return b[1] > a[1] end)
table.sort(t3, function(a, b) return b[1] > a[1] end)
coords[1] = t1[1]
coords[2] = t1[2]
coords[3] = t1[3]
coords[4] = t2[1]
coords[5] = t2[2]
coords[6] = t2[3]
coords[7] = t3[1]
coords[8] = t3[2]
coords[9] = t3[3]

for i, t in ipairs(coords) do
    print ("X: " .. t[1] .. " Y: " .. t[2])
end

程序产生所需的输出,即:

X: 136 Y: 97
X: 334 Y: 98
X: 552 Y: 107
X: 135 Y: 298
X: 334 Y: 308
X: 554 Y: 301
X: 135 Y: 487
X: 334 Y: 485
X: 555 Y: 400

因此y坐标被分组为三个,并且在这三个组中,这些点按x排序。问题是我不能做正常的按y,如果y是相等的,按x"因为y不相等,所以它们只是“分组”。"我对Lua很新,所以我想知道是否有更惯用或更优雅的方式来完成这个而不是我目前正在做的事情?

谢谢!

2 个答案:

答案 0 :(得分:4)

table.sort(coords, function(a,b) return a[2]<b[2] end)
for i, coord in ipairs(coords) do
  coord.g = math.floor((i-1)/3)  -- group no
end
table.sort(coords, function(a,b) return a.g<b.g or a.g==b.g and a[1]<b[1] end)

答案 1 :(得分:3)

没有更多惯用或直接的方法来创建您的特殊订单。 您的代码只能进行修剪和校准,如下所示:

coords = {{135, 487}, {135, 298}, {334, 308}, {334, 485}, {554, 301}, {555, 400}, {136, 97}, {334, 98}, {552, 107}}

table.sort(coords, function(a, b) return b[2] > a[2] end)
for i = 1, #coords, 3 do
    local t = {coords[i], coords[i+1], coords[i+2]}
    table.sort(t, function(a, b) return b[1] > a[1] end)
    coords[i], coords[i+1], coords[i+2] = t[1], t[2], t[3]
end

for i, t in ipairs(coords) do
    print ("X: " .. t[1] .. " Y: " .. t[2])
end