2017-07-18 3 views
2

Ich brauche eine Funktion sort_on_values(t, ...) wo ... die Variablen sind, nach denen die Tabelle t sortiert werden sollte. oder sort_on_values(t, t_v) wobei t_v eine Tabelle mit Variablen ist, nach denen die Tabelle t sortiert werden soll. Oder so etwas.Wie sortiere ich eine Tabelle für mehrere Werte in lua?

Funktion gibt eine sortierte Tabelle zurück oder sortiert eine vorhandene Tabelle.

Beispiel # 1:

Ich habe eine Tabelle

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

ich dies tun:

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

Und als Ergebnis erhalte ich:

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

Beispiel # 2 :

ich dies tun:

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

Und als Ergebnis erhalte ich:

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

Dies sollte auch funktionieren, wenn ich eine Tabelle wie

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}} 

Und so weiter.

Wie kann ich das tun?

Antwort

3

Variante für Vararg Funktion

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 das funktioniert! vielen dank moteus –

1

Allgemein Code für diese Aufgabe wird es wahrscheinlich einige Arbeit, aber Sie können mit dieser beginnen:

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

Wow cool danke! Scheint zu arbeiten. Aber was, wenn ich "d", "e" usw. habe? Idealerweise hätte ich gerne eine allgemeinere Lösung. Es scheint schwieriger zu implementieren. Aber trotzdem danke) –

Verwandte Themen