2017-07-18 36 views
2

我需要一个函数 sort_on_values(t, ...) 其中...是表t应该排序的变量。 或sort_on_values(t, t_v) 其中t_v是一个表格,其中t应该被排序。 或类似的东西。如何对lua中的多个值进行排序?

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

例子#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}} 

等等这应该也行。

我该怎么做?

回答

3

变的可变参数的函数

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 
+0

Omg的工作!非常感谢moteus –

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 
+0

哇凉的感谢!似乎工作。但是如果我有“d”,“e”等呢?理想情况下,我想有一个更一般的解决方案。 这似乎更难以实施。 但是,无论如何感谢) –

相关问题