调用table.sort返回nil

时间:2019-07-16 19:30:07

标签: lua

我正在尝试对表'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始终为零。我在这里做错什么了吗?

3 个答案:

答案 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