2014-06-10 9 views
5

Ho una matrice di numeri decimali come stringhe, ho bisogno di ottenere la somma dell'array, ho provato a scorrere l'array e cambiare ogni numero in un float ma quello restituisce solo un numero intero ogni volta e ho bisogno che la somma sia un decimale. A quale tipo di dati dovrei cambiare la stringa, e il modo migliore per ottenere la somma dell'array sarebbe utile.Come ottenere la somma di un array di stringhe in rubino

+0

Che cosa è "numeri decimali matrice come stringhe"? È un array, un numero o una stringa? Devi migliorare il tuo inglese per farti capire. – sawa

+1

Sembra che tu abbia provato qualcosa, ma non è chiaro al 100% di cosa si tratta. La cosa più semplice da fare è mostrare del codice, incluso un esempio di input, e cosa vorresti che fosse l'output. –

+0

Quando fai una domanda come questa, aiuta se mostri l'input di esempio e l'output che vuoi, oltre al codice che hai scritto per cercare di risolvere il problema. Senza queste cose sembra davvero che tu stia cercando qualcuno che scriva il codice per te. –

risposta

9

Hai solo bisogno di fare

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

Spiegazione: -

# 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 } 

Documentazione di #reduce e #map.

+0

Bella risposta. Penso che l'OP trarrebbe beneficio da qualche spiegazione. – joews

+1

["Se non si specifica esplicitamente un valore iniziale per' memo', il primo elemento della raccolta viene utilizzato come valore iniziale di 'memo'."] (Http://ruby-doc.org/core-2.1 .2/Enumerable.html # method-i-inject) quindi non è necessario specificare l'iniziale '0.0'. –

+0

@muistooshort È successo in qualche modo. Non so perché :(. Comunque, l'ho corretto. Grazie per il commento –

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

inject consente di accumulare un valore in tutto. Documentazione di #inject

0

penso che si può utilizzare una delle seguenti dichiarazioni:

array.map(&:to_f).reduce(:+) 
array.sum(&:to_f) 
2
  • In primo luogo abbiamo messo stringa di numeri in array di stringhe
  • In secondo luogo abbiamo cambiare l'intero blocco in numeri
  • Quindi riassumiamo tutto se Array è vuoto, quindi non otteniamo nulla ma 0

String in somma

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

array di numeri in somma

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