2012-07-29 48 views
1

我有這個數組:更好的方法來正則表達式排序?

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

使用basename,而不是自己進行解析的路徑:

arr.sort_by { |path| File.basename(path, '.txt').to_i } 

這會產生性能上的改善顯著(大小爲20000的arr):

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) 
+0

偉大謝謝! – Stpn 2012-07-29 16:42:29

+0

這回答了這個問題,但它似乎只能使用'N.txt'命名的形式文件。但是,它不處理文件名和路徑中任何地方的數字的一般情況。 – Lindydancer 2012-07-29 16:42:42

+0

@Lindydancer這不是OP的原始代碼。 – 2012-07-29 16:58:18