我正在尝试对表'array'进行排序,该表包含带有两个键分别为'pt'和'angle'的表。我想对“数组”元素的“角度”值进行排序。就我对table.sort的理解而言,此代码段应该可以解决问题:
local array = {}
-- Some code that calls
-- table.insert(array, {pt = somePt, angle = someAngle})
-- multiple times
local sorted_table = table.sort(array, function(a,b) return a.angle < b.angle end)
但是,sorted_table始终为零。我在这里做错什么了吗?
答案 0 :(得分:2)
table.sort
对表的数组部分进行适当排序。它不返回新数组。如果需要保留原始文档,则首先需要复制到一个临时数组。
所以,尝试这样的事情:
table.sort(array,function(a,b) return a.angle < b.angle end)
答案 1 :(得分:2)
table.sort
对表格进行适当排序;也就是说,它会更改您提供的表,并且不会返回新表。
如果要排序的副本,首先必须自己制作表格的副本,然后对其进行排序。
这可能看起来像这样:
local function sorted_copy(tab, func)
local tab = {table.unpack(tab)}
table.sort(tab, func)
return tab
end
这将创建表的副本(至少是数字索引,直到某些随机边界)并对其进行排序。
答案 2 :(得分:0)
没有秘密,有一种用于这种排序的算法,已经被使用了很多次:
function quicksort(t, sortname, start, endi)
start, endi = start or 1, endi or #t
sortname = sortname or 1
if(endi - start < 1) then return t end
local pivot = start
for i = start + 1, endi do
if t[i][sortname] <= t[pivot][sortname] then
local temp = t[pivot + 1]
t[pivot + 1] = t[pivot]
if(i == pivot + 1) then
t[pivot] = temp
else
t[pivot] = t[i]
t[i] = temp
end
pivot = pivot + 1
end
end
t = quicksort(t, sortname, start, pivot - 1)
return quicksort(t, sortname, pivot + 1, endi)
end
local array = {}
table.insert(array, {pt = 1, angle = 2})
table.insert(array, {pt = 4, angle = 9})
table.insert(array, {pt = 1, angle = 5})
table.insert(array, {pt = 2, angle = 7})
table.insert(array, {pt = 2, angle = 1})
table.insert(array, {pt = 5, angle = 2})
local s_t = quicksort(array, "angle")
for k,v in pairs(s_t) do
print(k, "v=", v.pt, v.angle)
end
输出:
1 v= 2 1
2 v= 5 2
3 v= 1 2
4 v= 1 5
5 v= 2 7
6 v= 4 9