首页 文章

将长固定数转换为数组Ruby

提问于
浏览
7

在ruby中有一个方法可以将像 74239 这样的fixnum变成像 [7,4,2,3,9] 这样的数组吗?

6 回答

  • 4

    您也可以使用 Array.new 而不是 map

    n = 74239
    
    s = Math.log10(n).to_i + 1 # Gets the size of n
    
    Array.new(s) { d = n % 10; n = n / 10; d }.reverse
    
  • 5

    对于这类事情,你不需要通过string-land进行往返:

    def digits(n)
        Math.log10(n).floor.downto(0).map { |i| (n / 10**i) % 10 }
    end
    
    ary = digits(74239)
    # [7, 4, 2, 3, 9]
    

    这确实假设 n 当然是肯定的,如果需要,将 n = n.abs 滑入混音可以处理 . 如果您需要涵盖非正值,那么:

    def digits(n)
        return [0] if(n == 0)
        if(n < 0)
           neg = true
           n   = n.abs
        end
        a = Math.log10(n).floor.downto(0).map { |i| (n / 10**i) % 10 }
        a[0] *= -1 if(neg)
        a
    end
    
  • 1

    您可以转换为字符串并使用chars方法:

    74239.to_s.chars.map(&:to_i)
    

    输出:

    [7, 4, 2, 3, 9]
    

    它比分裂更优雅 .

  • 1

    在Ruby 2.4中,整数将具有digits method .

  • 7

    也许不是最优雅的解决方案:

    74239.to_s.split('').map(&:to_i)
    

    输出:

    [7, 4, 2, 3, 9]
    
  • 15

    divmod方法可用于一次提取一个数字

    def digits n
      n= n.abs
      [].tap do |result|
        while n > 0 
          n,digit = n.divmod 10
          result.unshift digit
        end
      end
    end
    

    快速基准测试显示,这比使用日志提前查找数字更快,这本身比基于字符串的方法更快 .

    bmbm(5) do |x|
      x.report('string') {10000.times {digits_s(rand(1000000000))}}
      x.report('divmod') {10000.times {digits_divmod(rand(1000000000))}}
      x.report('log') {10000.times {digits(rand(1000000000))}}
    end
    
    #=>
                 user     system      total        real
    string   0.120000   0.000000   0.120000 (  0.126119)
    divmod   0.030000   0.000000   0.030000 (  0.023148)
    log      0.040000   0.000000   0.040000 (  0.045285)
    

相关问题