如何在lua中对多个值进行排序?

时间:2017-07-18 10:40:55

标签: sorting lua

我需要一个功能 sort_on_values(t, ...) 其中...是表t应该排序的变量。 或sort_on_values(t, t_v) 其中t_v是一个包含变量的表,表t应该通过变量进行排序。 或类似的东西。

函数返回已排序的表或对现有表进行排序。

示例#1:

我有一张桌子

t = {{a=1,b=2,c=3},
     {a=1,b=1,c=2},
     {a=3,b=2,c=2}}

我这样做:

t = sort_on_values(t,a,b,c)

结果我得到了:

t == {{a=1,b=1,c=2},
      {a=1,b=2,c=2},
      {a=3,b=2,c=2}}

示例#2:

我这样做:

t = sort_on_values(t,b,a,c)

结果我得到了:

t == {{a=1,b=1,c=2},
      {a=1,b=2,c=3},
      {a=3,b=2,c=2}}

如果我有像

这样的表格,这也应该有效
t = {{a=1,b=1,c=2,d=1},
     {a=1,b=2,c=3,d=2},
     {a=3,b=2,c=2,d=3}}

等等。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

vararg函数的变体

function sort_on_values(t,...)
  local a = {...}
  table.sort(t, function (u,v)
    for i = 1, #a do
      if u[a[i]] > v[a[i]] then return false end
      if u[a[i]] < v[a[i]] then return true end
    end
  end)
end

答案 1 :(得分:1)

此任务的通用代码可能需要一些工作,但您可以从这开始:

t = {
    {a=1,b=2,c=3},
    {a=1,b=1,c=2},
    {a=3,b=2,c=2},
}

function sort_on_values(t,a,b,c)
    table.sort(t, function (u,v)
        return
             u[a]<v[a] or
            (u[a]==v[a] and u[b]<v[b]) or
            (u[a]==v[a] and u[b]==v[b] and u[c]<v[c])
    end)
end

sort_on_values(t,"a","b","c")
for i=1,#t do
    print(i,t[i].a,t[i].b,t[i].c)
end