Dre*_*anh 5 sorting lua lua-table
我想按字母顺序排序表.除了数字.
下面的代码显示了如何使用比较器函数对表进行排序:
function( a,b ) return a.N < b.N end
Run Code Online (Sandbox Code Playgroud)
给我:
obj = {
[1] = {
["N"] = "Green 1";
};
[2] = {
["N"] = "Green 11";
};
[3] = {
["N"] = "Green 2";
};
[4] = {
["N"] = "Red 1";
};
}
Run Code Online (Sandbox Code Playgroud)
但是我希望它像这样排序:
obj = {
[1] = {
["N"] = "Green 1";
};
[2] = {
["N"] = "Green 2";
};
[3] = {
["N"] = "Green 11";
};
[4] = {
["N"] = "Red 1";
};
}
Run Code Online (Sandbox Code Playgroud)
可能吗?
试试这个:
local function split(a)
local x,y=a.N:match("(%S+)%s+(%S+)")
return x,tonumber(y)
end
table.sort(obj,
function (a,b)
local a1,a2=split(a)
local b1,b2=split(b)
return a1<b1 or (a1==b1 and a2<b2)
end
)
Run Code Online (Sandbox Code Playgroud)
本来打算发布此内容,但 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
Run Code Online (Sandbox Code Playgroud)
印刷:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |