2014-06-10 29 views
5

Mam tablicę liczb dziesiętnych jako ciągi, potrzebuję uzyskać sumę tablicy, Próbowałem iteracji nad tablicą i zmieniając każdą liczbę na float, ale to po prostu zwraca liczbę całkowitą za każdym razem i potrzebuję sumy w postaci dziesiętnej. Do jakiego typu danych powinienem zmienić ciąg, a najlepszy sposób uzyskania sumy tablicowej byłby pomocny.Jak uzyskać sumę tablicę ciągów w ruby ​​

+0

co jest "tablica liczb dziesiętnych jako łańcuchy"? Czy jest to tablica, numer lub ciąg znaków? Musisz poprawić swój angielski, aby zrozumieć siebie. – sawa

+1

Wygląda na to, że próbowałeś czegoś, ale nie jest w 100% jasne, co to jest. Najłatwiej jest pokazać kod, w tym przykładowe wejście i to, co chciałbyś otrzymać. –

+0

Gdy zadajesz takie pytanie, pomocne jest pokazanie przykładowego wejścia i żądanego wyniku, a także kodu, który napisałeś, aby spróbować rozwiązać problem. Bez tych rzeczy wygląda na to, że łowisz, żeby ktoś napisał dla ciebie kod. –

Odpowiedz

9

Trzeba tylko zrobić

array.map(&:to_f).reduce(:+) 

Objaśnienie: -

# it give you back all the Float instances from String instances 
array.map(&:to_f) 
# same as 
array.map { |string| string.to_f } 
array.map(&:to_f).reduce(:+) 
# is a shorthand of 
array.map(&:to_f).reduce { |sum, float| sum + float } 

Dokumentacja #reduce i #map.

+0

Dobra odpowiedź. Sądzę, że OP zyskałby na pewnym wytłumaczeniu. – joews

+1

["Jeśli nie określisz jawnie wartości początkowej dla' memo', to pierwszy element kolekcji jest używany jako wartość początkowa 'memo'."] (Http://ruby-doc.org/core-2.1 .2/Enumerable.html # method-i-inject), więc nie trzeba określać początkowego "0.0". –

+0

@muistooshort Tak się stało. Nie wiem dlaczego :(Ale tak, poprawiłem to.Dziękuję za komentarz –

1
a = ["12.4", "48.2"] 
a.inject(0) {|s,e| s.to_f + e.to_f } #=> 60.6 

inject pozwala na zbieranie wartości w poprzek. Dokumentacja #inject

0

myślę, że można użyć jednej z następujących stwierdzeń:

array.map(&:to_f).reduce(:+) 
array.sum(&:to_f) 
2
  • Najpierw stawiamy ciąg liczb do tablicy ciągów
  • drugie możemy zmienić cały blok w liczbach
  • Następnie podsumowujemy wszystko, jeśli macierz jest pusty, nie otrzymujemy zero, ale 0

String do sumy

str='1,2,3,4'.split(',').map(&:to_i).inject(0,:+) #1+2+3+4=10 

Array liczb w sumie

num=[1,2,3,4].inject(0,:+)#=>10 
p str 
p num