我有一个存储文件名的表,例如:
1.jpg
5.jpg
4.jpg
10.jpg
2.jpg
现在我想对它进行排序。我使用了以下代码:
table.sort(myTable)
结果是
1.jpg
10.jpg
2.jpg
4.jpg
5.jpg
但是,我想这样排序:
1.jpg
2.jpg
4.jpg
5.jpg
10.jpg
所以我写了一个自定义比较函数:
function compare(a, b)
return tonumber(a) < tonumber(b)
end
但它出现了:attempt to compare two nil values
。那我怎么能实现呢?
答案 0 :(得分:5)
您需要先从比较的文件名中提取一个数字。假设数字是唯一的,这样的东西应该有效:
function compare(a, b)
return tonumber(a:match("%d+")) < tonumber(b:match("%d+"))
end
您可能还想查看Alphanum sorting for humans in Lua上的帖子,其中包含此案例和其他案例。
[已更新以解决评论中的问题]要按字符串和数字的组合进行排序,您只需按照链接博客文章中的一个选项进行排序即可。例如,要对注释中列出的文件名进行排序,可以使用以下命令:
local t = {"file001_abc_10.txt", "file001_abc_2.txt", "file001_bcd_4.txt", "file001_bcd_12.txt"}
function compare(a, b)
local function padnum(n, rest) return ("%03d"..rest):format(tonumber(n)) end
return tostring(a):gsub("(%d+)(%.)",padnum) < tostring(b):gsub("(%d+)(%.)",padnum)
end
table.sort(t, compare)
print(unpack(t))
打印:file001_abc_2.txt file001_abc_10.txt file001_bcd_4.txt file001_bcd_12.txt
。您可以在padnum
功能中调整数字长度。