Sorting Lua:表排序中的自定义比较函数

Sorting Lua:表排序中的自定义比较函数,sorting,lua,Sorting,Lua,我有一个存储文件名的表,例如: 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) e

我有一个存储文件名的表,例如:

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
功能比较(a、b)
返回编号(a)<返回编号(b)
结束

但结果是:
尝试比较两个nil值。那么我该如何实现它呢?

您需要先从要比较的文件名中提取一个数字。假设数字是唯一的,类似这样的方法应该可以工作:

function compare(a, b)
    return tonumber(a:match("%d+")) < tonumber(b:match("%d+"))
end
功能比较(a、b)
返回tonnumber(a:match(“%d+”)
你可能还想查看我的帖子,它涵盖了这个和其他情况

[更新以解决评论中的问题]要按字符串和数字的组合进行排序,您只需遵循链接博客文章中的一个选项即可。例如,要对注释中列出的文件名进行排序,可以使用以下命令:

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))
localt={“file001_abc_10.txt”、“file001_abc_2.txt”、“file001_bcd_4.txt”、“file001_bcd_12.txt”}
功能比较(a、b)
本地函数padnum(n,rest)返回(“%03d”。.rest):格式(tonumber(n))结束
返回到字符串(a):gsub((%d+)(.%.),padnum)

这将打印:
file001\u abc\u 2.txt file001\u abc\u 10.txt file001\u bcd\u 4.txt file001\u bcd\u 12.txt
。您可以在
padnum
函数中调整数字长度。

回答得很好,但是如果我想处理这种比较的情况,“file001\u xxx\u 123.txt”与“file001\u xxx\u 21.txt”比较,如何修改代码?如果您只关心点之前的数字,您可以将其锚定到点:
匹配(((%d+))
实际上文件名是这样的,“file001_abc_10.txt”、“file001_abc_1.txt”、“file001_bcd_4.txt”、“file001_bcd_12.txt”,我想要的结果就像“file001_abc_1.txt”、“file001_abc_10.txt”、“file001_bcd_4.txt”、“file001_bcd_12.txt”。看起来有点复杂。使用我在博客文章中展示的解决方案仍然可行;添加了如何实现的示例。