如何使用一个表格的顺序同时对两个表格进行排序?

table1 = {2,3,1}
table2 = {a,b,c}

变为

table1 = {1,2,3}
table2 = {c,a,b}
点赞
用户990750
用户990750

我会:

步骤1:将两个表合并成一对 {{2,a},{3,b},{1,c}}

步骤2:对这些对进行排序。

步骤3:将结果数组分离。

table1 = {2,3,1}
table2 = {"a","b","c"}

-- 比较函数
function compare(x, y)
    return x[1] < y[1]
end

-- 步骤1:成对合并
for i,v in ipairs(table1) do
    table1[i] = {table1[i], table2[i]}
end

-- 步骤2:排序
table.sort(table1, compare)

-- 步骤3:分离成对
for i, v in ipairs(table1) do
    table1[i] = v[1]
    table2[i] = v[2]
end

for i = 1,#table1 do
    print(table1[i], table2[i])
end
2015-02-10 22:30:35
用户107090
用户107090

尝试使用标准函数 table.sort 的代码如下:

table1 = {2,3,1}
table2 = {"a","b","c"}

table3 = {}
for i,v in ipairs(table1) do
    table3[table2[i]]=v
end

table.sort(table1, function (a,b)
    return table2[a] <= table2[b]
    end)

table.sort(table2, function (a,b)
    return table3[a] <= table3[b]
    end)

print("table1")
for i,v in ipairs(table1) do
    print(i,v)
end

print("table2")
for i,v in ipairs(table2) do
    print(i,v)
end
2015-02-10 23:15:27
用户204011
用户204011

该函数不修改任何一个表格,且返回第二个表格根据第一个表格排序后的结果。你可以像 table.sort 中那样为第一个表格的键传递一个比较函数。

local sort_relative = function(ref, t, cmp)
    local n = #ref
    assert(#t == n)
    local r = {}
    for i=1,n do r[i] = i end
    if not cmp then cmp = function(a, b) return a < b end end
    table.sort(r, function(a, b) return cmp(ref[a], ref[b]) end)
    for i=1,n do r[i] = t[r[i]] end
    return r
end

例如:

local table1 = {2, 3, 1}
local table2 = {"a","b","c"}
local sorted = sort_relative(table1, table2)
print(table.unpack(sorted))

的结果是:

c   a   b
2015-02-10 23:15:56
用户990750
用户990750

我使用键值对和普通的排序函数来完成任务:

table1 = {2,3,1}
table2 = {"a","b","c"}

table3 = {}
for i, v in ipairs(table2) do
    table3[table1[i]] = v
end

table.sort(table1)

table2 = {}
for i = 1,#table1 do
    table2[i]=table3[table1[i]]
end
table3=nil

for i = 1,#table1 do
    print(table1[i], table2[i])
end
2015-02-11 07:02:29