2

我有这个数组:

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}

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

4

1 回答 1

5

使用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)
于 2012-07-29T16:30:58.273 回答