通过正则表达式排序数组的更好方法?

时间:2012-07-29 16:19:42

标签: ruby regex arrays sorting

我有这个数组:

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}

我想知道 - 有更好的方法吗?

1 个答案:

答案 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)