在ruby中有一个方法可以将像 74239 这样的fixnum变成像 [7,4,2,3,9] 这样的数组吗?
74239
[7,4,2,3,9]
您也可以使用 Array.new 而不是 map :
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
对于这类事情,你不需要通过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 滑入混音可以处理 . 如果您需要涵盖非正值,那么:
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
您可以转换为字符串并使用chars方法:
74239.to_s.chars.map(&:to_i)
输出:
[7, 4, 2, 3, 9]
它比分裂更优雅 .
在Ruby 2.4中,整数将具有digits method .
也许不是最优雅的解决方案:
74239.to_s.split('').map(&:to_i)
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)
6 回答
您也可以使用
Array.new
而不是map
:对于这类事情,你不需要通过string-land进行往返:
这确实假设
n
当然是肯定的,如果需要,将n = n.abs
滑入混音可以处理 . 如果您需要涵盖非正值,那么:您可以转换为字符串并使用chars方法:
输出:
它比分裂更优雅 .
在Ruby 2.4中,整数将具有digits method .
也许不是最优雅的解决方案:
输出:
divmod方法可用于一次提取一个数字
快速基准测试显示,这比使用日志提前查找数字更快,这本身比基于字符串的方法更快 .