2017-07-18 13 views
2

私は関数が必要です sort_on_values(t, ...) ...はテーブルtをソートする変数です。 またはsort_on_values(t, t_v) t_vは、テーブルtをソートする変数を持つテーブルです。 またはそれのようなもの。ルアで複数の値を持つテーブルをソートする方法は?

ソートされたテーブルを返すか、既存のテーブルをソートします。

例#1:

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 = {{a=1,b=2,c=3}, 
    {a=1,b=1,c=2}, 
    {a=3,b=2,c=2}} 

を持っています:

私はこれを行う:

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

そして、結果として私が手:私は上の

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

などのテーブルを持っている場合

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

また、これは動作するはずです。

どうすればいいですか?このタスクの

答えて

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 that working!多くのありがとう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"などを持っていたら?理想的には、私はもっと一般的な解決策を持っていたいと思います。 実装するのが難しいようです。 しかし、とにかくありがとう) –

関連する問題