【问题标题】:A better way to sort array by regex?通过正则表达式对数组进行排序的更好方法?
【发布时间】:2012-07-29 16:19:41
【问题描述】:

我有这个数组:

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}

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

【问题讨论】:

    标签: ruby regex arrays sorting


    【解决方案1】:

    使用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)
    

    【讨论】:

    • 这回答了这个问题,但似乎它只适用于使用 N.txt 命名的表单文件。但是,它不处理文件名和路径中任何位置的数字的一般情况。
    • @Lindydancer OP 的原始代码也不打算这样做。
    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2020-02-03
    • 2019-09-07
    相关资源
    最近更新 更多