我想按字母顺序排序表.除了数字. 下面的代码显示了如何使用比较器函数对表进行排序: function( a,b ) return a.N b.N end 给我: obj = { [1] = { ["N"] = "Green 1"; }; [2] = { ["N"] = "Green 11"; }; [3] = {
下面的代码显示了如何使用比较器函数对表进行排序:
function( a,b ) return a.N < b.N end
给我:
obj = {
[1] = {
["N"] = "Green 1";
};
[2] = {
["N"] = "Green 11";
};
[3] = {
["N"] = "Green 2";
};
[4] = {
["N"] = "Red 1";
};
}
但是我希望它像这样排序:
obj = {
[1] = {
["N"] = "Green 1";
};
[2] = {
["N"] = "Green 2";
};
[3] = {
["N"] = "Green 11";
};
[4] = {
["N"] = "Red 1";
};
}
可能吗?
本来打算发布这个,但是lhf发布的解决方案回答了你的问题.由于您仍然遇到问题,请尝试以下操作.local function cmp(a, b)
a = tostring(a.N)
b = tostring(b.N)
local patt = '^(.-)%s*(%d+)$'
local _,_, col1, num1 = a:find(patt)
local _,_, col2, num2 = b:find(patt)
if (col1 and col2) and col1 == col2 then
return tonumber(num1) < tonumber(num2)
end
return a < b
end
local obj = {
{ N = '1' },
{ N = 'Green1' }, -- works with optional space
{ N = 'Green' }, -- works when doesn't fit the format
{ N = 'Sky blue99' },
{ N = 'Green 11' },
{ N = 'Green 2' },
{ N = 'Red 02' }, -- works when has leading zeros
{ N = 'Red 01' }, -- works with padding spaces
{ N = 'Sky blue 42' }, -- works with multi-word color names
{ N = 99 }, -- works with numbers
}
table.sort(obj, cmp)
for i,v in ipairs(obj) do
print(i, v.N)
end
打印:
1 1 2 99 3 Green 4 Green1 5 Green 2 6 Green 11 7 Red 01 8 Red 02 9 Sky blue 42 10 Sky blue99
