2017-07-18 66 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」等呢?理想情況下,我想有一個更一般的解決方案。 這似乎更難以實施。 但是,無論如何感謝) –

相關問題