9

fixnum のようなもの74239を のような配列に変換する方法は ruby​​ にあり[7,4,2,3,9]ますか?

4

7 に答える 7

17

おそらく最もエレガントなソリューションではない:

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

出力:

[7, 4, 2, 3, 9]
于 2012-10-16T05:25:05.363 に答える
9

この種のことのために、ストリングランドを往復する必要はありません。

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
于 2012-10-16T05:36:56.877 に答える
5

文字列に変換して chars メソッドを使用できます。

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

出力:

[7, 4, 2, 3, 9]

分割よりも少しエレガントです。

于 2015-10-29T01:14:39.027 に答える
5

divmod メソッドを使用して、数字を 1 つずつ抽出できます。

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

簡単なベンチマークでは、log を使用して事前に桁数を見つけるよりも高速であることが示されました。これは、文字列ベースの方法よりも高速でした。

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)
于 2012-10-16T07:54:32.190 に答える
3

Ruby 2.4 の時点で、整数 ( FixNum2.4+ ではなくなりました) には、digitsそれらを数字の配列に抽出する組み込みメソッドがあります。

74239.digits
=> [9, 3, 2, 4, 7]

数字の順序を維持したい場合は、チェーンするだけですreverse

74239.digits.reverse
=> [7, 4, 2, 3, 9]

ドキュメント: https://ruby-doc.org/core-2.4.0/Integer.html#method-i-digits

于 2020-05-11T08:20:55.797 に答える
1

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 
于 2016-09-27T18:10:38.053 に答える
1

Ruby 2.4 では、整数にはdigits メソッドがあります。

于 2016-11-02T12:13:10.967 に答える