2015-02-10 82 views

回答

3

我将:

步骤1:合并两个表到双{{2,},{3,B},{1 ,c}}

第2步:对配对进行排序。

第3步:取消合并结果数组。

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


-- Comparison function 
function compare(x, y) 
    return x[1] < y[1] 
end 

-- Step 1: Merge in pairs 
for i,v in ipairs(table1) do 
    table1[i] = {table1[i], table2[i]} 
end 

-- Step 2: Sort 
table.sort(table1, compare) 

-- Step 3: Unmerge pairs 
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 
0

试试这个代码,其中使用标准的功能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 
+0

有趣的方法但成本太高。 – Tarik 2015-02-11 07:30:08

5

该函数不修改任何一个表中,并返回根据第一排序的第二个表。您可以在第一个表中传递键的比较,如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 
+0

这确实是一种优雅和干净的方法。正如谚语所说的那样,“有一种方法可以让猫变皮”。 – Tarik 2015-02-11 10:32:47

1

我用键值对,并定期排序功能做的工作:

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 
相关问题