Lua按字母顺序对表进行排序,但不包括数字。
2015-1-12 20:32:38
收藏:0
阅读:124
评论: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";
};
}
是否可能呢?
点赞
用户1442917
@lhf的解决方案应该适合您,但是您可能需要考虑一些角落情况,比如将"Green 1"与"Green 02"进行比较或将"Green 2"与"Green 02"进行比较。我在一篇博客文章中评论了几种实现字母数字排序的方法,并比较了它们的结果。您还可以在lua邮件列表上的讨论中查看关于此话题的讨论。
2015-01-12 20:41:03
用户415823
原本打算发布这个问题,但是 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
2015-01-12 22:13:27
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
尝试一下:
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 )