调用表.排序返回 nil



>我正在尝试对一个表"数组"进行排序,该表包含具有两个键的表,分别称为"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始终为零。我在这里做错了什么吗?

table.sort

表的数组部分进行排序。 它不返回新数组。 如果需要保留原始数组,则首先需要复制到临时数组。

因此,请尝试以下操作:

table.sort(array,function(a,b) return a.angle < b.angle end)
table.sort

地对表进行排序;也就是说,它会更改您提供给它的表,并且不会返回新表。

如果你想要一个排序的副本,

你首先必须自己制作一个表的副本,然后对它进行排序。

这可能看起来像这样:

local function sorted_copy(tab, func)
  local tab = {table.unpack(tab)}
  table.sort(tab, func)
  return tab
end

这将创建表格的副本(至少是数字索引,直到某个随机边框(并对其进行排序。

没有

秘密,这种排序有一个算法,已经被用了很多次:

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

最新更新