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 に答える