排序这些类型的字符串的最佳方法是什么?

Tho*_*rin 2 ruby arrays sorting ruby-on-rails

我需要获取目录和子目录中的所有文件,并且每个文件的日期都附加到文件名,如product_log_2016-11-17.txt

获取我使用的目录中存在的文件列表

all_logs = Dir["#{Rails.root}/log/product_logs/**/*.txt"]
Run Code Online (Sandbox Code Playgroud)

它返回这样的完整路径文件(我已从每个条目中删除了我的系统路径:

[
  "/log/product_logs/new_2/product_log_2016-11-17.txt",
  "/log/product_logs/new_2/products_log_2016-11-03.txt",
  "/log/product_logs/new_1/products_log_2016-10-04.txt",
  "/log/product_logs/new_1/product_log_2016-11-17.txt",
  "/log/product_logs/new_1/products_log_2016-11-03.txt"
]
Run Code Online (Sandbox Code Playgroud)

但是我希望像这样按日期排序:

[
  "/log/product_logs/new_2/product_log_2016-11-17.txt",
  "/log/product_logs/new_1/product_log_2016-11-17.txt",
  "/log/product_logs/new_2/products_log_2016-11-03.txt",
  "/log/product_logs/new_1/products_log_2016-11-03.txt",
  "/log/product_logs/new_1/products_log_2016-10-04.txt"
]
Run Code Online (Sandbox Code Playgroud)

我试过这样的:

all_logs.sort{|a, b|b.split("/").last.split("_").last.split(".").first <=>a.split("/").last.split("_").last.split(".").first }
Run Code Online (Sandbox Code Playgroud)

哪个有效,但似乎不是一个好的解决方案,任何人都可以让我知道什么是最好的方式来输入这种类型的列表?

Ale*_*kin 5

? input.sort_by { |i| [i[/\d{4}-\d{1,2}-\d{1,2}/], i[/\d+/]] }
#? [
#    [0] "/log/product_logs/new_1/products_log_2016-10-04.txt",
#    [1] "/log/product_logs/new_1/products_log_2016-11-03.txt",
#    [2] "/log/product_logs/new_2/products_log_2016-11-03.txt",
#    [3] "/log/product_logs/new_1/product_log_2016-11-17.txt",
#    [4] "/log/product_logs/new_2/product_log_2016-11-17.txt"
# ]
Run Code Online (Sandbox Code Playgroud)

与给出的答案相比有两个优点:

  • 它按数字对相同日期排序new_???,并且
  • sort_by是更快的方式比sort.

要接收降序排序,只需将呼叫链接到Enumerable#reverse最后.