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

我有一个存储文件名的表,如下所示:

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

但是它显示出错误:尝试比较两个空值。那么我该如何实现它呢?

点赞
用户1442917
用户1442917

你需要首先从要比较的文件名中提取一个数字。假设数字是唯一的,可以使用以下代码:

function compare(a, b)
    return tonumber(a:match("%d+")) < tonumber(b:match("%d+"))
end

你可能也想查看我在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函数中调整数字长度。

2016-05-05 05:34:13