Erlang-根据扩展名之前的后缀号对文件列表进行排序



我有一个列表:

["storage.pages/4532.1.html",
"storage.pages/4532.12.html",
"storage.pages/4532.2.html",
"storage.pages/4532.3.html",
"storage.pages/4532.4.html",
"storage.pages/4532.5.html"]

我想做这样的事情:

last_filename(PageId)->
Files1 = filelib:wildcard("storage.pages/" ++ wf:to_list(PageId) ++ ".*.html"),
hd(lists:reverse(lists:sort(Files1))).

它此时返回CCD_ 1,但我希望它返回"storage.pages/4532.12.html"

我需要对函数进行哪些好的调整,以便它总是返回列表中在基名称中后缀号最高的元素?

干杯!

高效的解决方案(在Perl世界中被称为Schwartzian变换(:

L = ["storage.pages/4532.1.html",
"storage.pages/4532.12.html",
"storage.pages/4532.2.html",
"storage.pages/4532.3.html",
"storage.pages/4532.4.html",
"storage.pages/4532.5.html"].
element(2, lists:max([ {list_to_integer(lists:last(string:tokens(filename:basename(X, ".html"), "."))), X} || X <- L])).

作为模块中的一个功能

last_filename(PageId) ->
Files = filelib:wildcard("storage.pages/" ++ wf:to_list(PageId) ++ ".*.html"),
FilesWVersion = [ {version(FN), FN} || FN <- Files ],
{_, LF} = lists:max(FilesWVersion),
LF.
version(FileName) ->
BN = filename:basename(X, ".html"),
VS = lists:last(string:tokens(BN, ".")),
list_to_integer(VS).

在这种情况下,您不需要将字符串的一部分转换为数字。只需先比较字符串的长度。

L=["storage.pages/4532.1.html",
"storage.pages/4532.12.html",
"storage.pages/4532.2.html",
"storage.pages/4532.3.html",
"storage.pages/4532.4.html",
"storage.pages/4532.5.html"].
RComp = fun(X,Y)->length(X) > length(Y) orelse X > Y end.
hd(lists:sort(RComp,L)).

输出:

"storage.pages/4532.12.html">

我这样解决了它,但欢迎提出改进建议:

last_filename(Page)->
Files1 = filelib:wildcard("storage.pages/" ++ wf:to_list(Page#page.id) ++ ".*.html"),
Files2 = lists:sort(fun(X, Y) ->
X1 = wf:to_integer(lists:nth(2, lists:reverse(string:split(X, ".", all)))),
Y1 = wf:to_integer(lists:nth(2, lists:reverse(string:split(Y, ".", all)))),
X1 > Y1
end, Files1),
hd(Files2).

最新更新