Erlang-根据后缀号在扩展之前对文件进行排序

Erlang-根据后缀号在扩展之前对文件进行排序,erlang,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:wildcar

我有一份清单:

["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))).
此时返回
“storage.pages/4532.5.html”
,但我希望它返回
“storage.pages/4532.12.html”

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


干杯

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

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).

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

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).

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

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”


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

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”

高效的解决方案(在Perl世界中称为):

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”]。
元素(2,列表:max([{list_to_integer(列表:last(字符串:tokens(文件名:basename(X,“.html”),”))),X}| | X
Files=filelib:wildcard(“storage.pages/”++wf:to_list(PageId)+“*.html”),
FilesWVersion=[{version(FN),FN}| | FN
BN=文件名:basename(X,“.html”),
VS=列表:最后(字符串:标记(BN,“.”),
列出\u到\u整数(VS)。
高效的解决方案(在Perl世界中称为):

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”]。
元素(2,列表:max([{list_to_integer(列表:last(字符串:tokens(文件名:basename(X,“.html”),”))),X}| | X
Files=filelib:wildcard(“storage.pages/”++wf:to_list(PageId)+“*.html”),
FilesWVersion=[{version(FN),FN}| | FN
BN=文件名:basename(X,“.html”),
VS=列表:最后(字符串:标记(BN,“.”),
列出\u到\u整数(VS)。

如果有另一个(新的)文件'4532.21.html'?@TomRegner,对不起,我不明白你的意思。我现在明白了-很抱歉投票太快;如果你稍微编辑一下答案,我就可以收回它了-我把OP读成允许使用不同的前缀,没有意识到它们都是一样的。谢谢-我非常抱歉发生了这种情况。@JonRiel,这只是对字符串的比较。它们按字母顺序比较符号和符号,因此“0”和“9”在长度相等时起到数字比较的作用。顺便说一句,Erlang有一个特殊的功能。您可以在那里询问有关Erlang的任何问题。如果有其他问题(新)文件'4532.21.html'?@TomRegner,对不起,我不明白你的意思。我现在明白了-很抱歉投票太快;如果你稍微编辑一下答案,我就可以收回它了-我把OP读成允许使用不同的前缀,没有意识到它们都是一样的。谢谢-我非常抱歉发生了这种情况。@JonRiel,这只是对字符串的比较。它们按字母顺序比较符号和符号,因此“0”小于“9”,当长度相等时,它起到数字比较的作用。顺便说一句,Erlang有一个特殊的功能。您可以在那里询问有关Erlang的任何问题。