我有这个数组:
arr = ["/Users/user/Documents/public/170/41/texts/10.txt",
"/Users/user/Documents/public/170/41/texts/11.txt",
"/Users/user/Documents/public/170/41/texts/12.txt",
"/Users/user/Documents/public/170/41/texts/14.txt",
"/Users/user/Documents/public/170/41/texts/15.txt",
"/Users/user/Documents/public/170/41/texts/18.txt",
"/Users/user/Documents/public/170/41/texts/6.txt",
"/Users/user/Documents/public/170/41/texts/8.txt"]
我想按.txt文件的整数值对其进行排序。我这样做:
arr.sort_by{|h| h.scan(/(\d+)\.txt/).flatten[0].to_i}
我想知道 - 有更好的方法吗?
答案 0 :(得分:4)
使用basename
而不是自己解析路径:
arr.sort_by { |path| File.basename(path, '.txt').to_i }
这可以显着提高性能(arr
大小为20,000):
require 'benchmark'
Benchmark.bm(12) do |x|
x.report("regex: ") { arr.sort_by { |h| h.scan(/(\d+)\.txt/).flatten[0].to_i } }
x.report("basename: ") { arr.sort_by { |path| File.basename(path, '.txt').to_i } }
end
# user system total real
# regex: 0.170000 0.010000 0.180000 ( 0.169097)
# basename: 0.020000 0.000000 0.020000 ( 0.022535)