Gibt es eine Methode in Ruby, um fixnum wie 74239 in ein Array wie [7,4,2,3,9] umzuwandeln?Lange fixe Zahl in Array umwandeln Ruby
Antwort
Sie brauchen nicht eine Rundreise durch strang Land für diese Art der Sache zu nehmen:
def digits(n)
Math.log10(n).floor.downto(0).map { |i| (n/10**i) % 10 }
end
ary = digits(74239)
# [7, 4, 2, 3, 9]
Das geht davon aus, dass n
natürlich positiv ist, eine n = n.abs
in th gleiten Der Mix kann das bei Bedarf erledigen. Wenn Sie nicht-positive Werte decken, dann:
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
Die divmod Verfahren verwendet werden können, die Ziffern einen nach dem anderen
def digits n
n= n.abs
[].tap do |result|
while n > 0
n,digit = n.divmod 10
result.unshift digit
end
end
end
Eine schnelle Benchmark dies schneller sein zeigte zu extrahieren als die Verwendung von log, um die Anzahl der Ziffern im voraus zu finden, die selbst schneller war als die string-basierten Methoden.
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)
können Sie in String konvertieren und die Zeichen-Methode verwenden:
74239.to_s.chars.map(&:to_i)
Ausgang:
[7, 4, 2, 3, 9]
Es ist ein bisschen eleganter als Splitting.
Sie können auch Array.new
statt map
verwenden:
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
In Ruby 2.4 wird ganze Zahlen mit einem digits method haben.
Scheint ziemlich verschlungen. –
@RyanBigg: Nur wenn Sie Ihre High School Mathe vergessen haben. –