Lua大小写混合字符串数组排序问题求助
解决Lua table.sort忽略大小写排序且保留原格式的问题
嘿,我来帮你搞定这个排序问题!你已经找对了核心原因——Lua的table.sort默认用ASCII码直接比较,大写字母的ASCII值确实比小写字母低,所以才会出现Bee排在apple前面的情况。
要实现忽略大小写排序但保留原字符串大小写的需求,只需要给table.sort传一个自定义的比较函数就行。这个函数的逻辑很简单:临时把两个待比较的字符串转成小写(或大写)来比较大小,但原字符串本身完全不变。
具体实现代码
直接看修改后的测试代码:
test = {"apple", "Bee", "clown"} -- 传入自定义比较函数 table.sort(test, function(a, b) -- 转成小写后比较,原字符串不受任何修改 return string.lower(a) < string.lower(b) end) -- 用ipairs遍历数组更可靠(pairs不保证严格按数组顺序遍历) for k, v in ipairs(test) do print(k, v) end
执行这段代码后,输出就是你期望的结果:
1 apple 2 Bee 3 clown
自定义排序函数的细节说明
- 这个匿名函数接收两个参数
a和b,返回true就表示a应该排在b的前面。 string.lower(a)只是临时生成一个小写版本的字符串用于比较逻辑,完全不会修改原数组里的元素,所以排序后Bee还是保持原来的大小写形式。- 如果你的数组里存在忽略大小写后相同的元素(比如
"Apple"和"apple"),还可以优化函数,让它们按原大小写的ASCII顺序排序:
table.sort(test, function(a, b) local lowerA = string.lower(a) local lowerB = string.lower(b) -- 先按忽略大小写规则排序,相同时再按原字符串的ASCII顺序排列 if lowerA ~= lowerB then return lowerA < lowerB else return a < b end end)
这样就能完美满足你的需求啦!
内容的提问来源于stack exchange,提问作者Legofan431
相关产品推荐
相关产品推荐

