2015-04-28 27 views
-1

我試圖找到數組中各個值的總和,而不是將數字相加在一起。例如Ruby中的數組中的單個數字的總和

如果我有數組= [「123」,「324」,「644」] 我需要它返回每個值的總和,因此結果應該是

6,9,和14分別。由於1 + 2 + 3 = 6等... 我該如何做到這一點?

回答

6
array.map { |str| str.each_char.map(&:to_i).reduce(&:+) } 

對於數組中的每個字符串:將每個字符轉換爲一個整數並將它們相加。

1
array = ["123","324","644"] 
array.map do |num_string| 
    num_string.chars.map(&:to_i).inject(:+) 
end 
=> [6, 9, 14] 
+0

你有沒有注意到@Amadan使用'each_char'而不是'chars'? 'each_char'是首選,因爲它返回一個枚舉器,而'chars'返回一個佔用空間的數組。可以將枚舉數看作一組將數值提供給塊的規則,這些值是根據需要計算的。這些值是'array'的元素。艾爾:我剛剛讀了@桑托斯關於「chars」的評論,因爲這兩者中速度更快。 :-) –

1

會更有效,因爲地圖上沒有chars

array.map { |str| str.chars.inject(0){|s,x| s+= x.to_i } } 
# => [6, 9, 14] 
+0

是的。 'each_char.inject ...'更快(在我的'irb'上減少了17%)。 – Amadan

+0

的確很奇怪。在40M字符串中,對於'chars'的utime:13.84s,對於'each_char':8.72s(OS/X,MRI 2.2.0) – Amadan

0
2.2.0 :067 > array.each {|a| print a.split("").inject {|sum, x| sum.to_i+x.to_i}, "\t"} 
6 9 14 => ["123", "324", "644"] 
如果你想將這些值添加到另一個陣列

使用,

2.2.0 :068 > marray = [] 
=> [] 
2.2.0 :069 > array.each {|a| marray << a.split("").inject {|sum, x| sum.to_i+x.to_i}} 
=> ["123", "324", "644"] 
2.2.0 :070 > marray 
=> [6, 9, 14]