如何在Lua中按多个值对表格进行排序?

我需要一个函数 sort_on_values(t, ...) 其中 ... 是表格 t 应该按照其排序的变量。 或者 sort_on_values(t, t_v) 其中 t_v 是表格按其排序的变量的表格。 或者是类似这样的东西。

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

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

等等。

我该怎么办?

点赞
用户107090
用户107090
通常情况下,用于此任务的通用代码可能需要一些工作,但您可以从以下内容开始:

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


以下是中文翻译并保留原本的 markdown 格式:

通常情况下,用于此任务的通用代码可能需要一些工作,但您可以从以下内容开始:

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
2017-07-18 11:16:28
用户2328287
用户2328287

可变参数函数的变体

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
2017-07-18 12:47:58