2016-05-28 11 views
1

einen Hash, zum Beispiel Gegeben:Gibt es einen One-Liner oder einen effizienteren Weg dies zu erreichen?

hash = { "fish" => 2, "cat" => 3, "dog" => 1 } 

ich muß:

  1. Eine durch Kommata getrennte Zeichenfolge für alle Werte, zum Beispiel "2,3,1"
  2. Eine ganze Zahl, die die Gesamtsumme der Werte enthält, z. 6

Mein aktueller Code:

value_string = hash.map { |k,v| "#{v}"}.join(',') 
sum = 0 
hash.map { |k,v| sum += v} 
+0

Brauchen Sie wirklich eine Liner-Lösung für zwei Probleme? Beides kann ein Liner sein –

+0

Sie können jeden beliebigen Ruby-Code in einen Einzeiler verwandeln, indem Sie die Zeilenumbrüche durch Semikolons ersetzen: 'value_string = hash.map {| k, v | "# {v}"}. join (','); Summe = 0; hash.map {| k, v | Summe + = v} 'Voila! Eine Zeile, genau wie du gefragt hast. –

Antwort

9

Sie können es wie folgt tun:

hash.values.join(",") # => "2,3,1" 
hash.values.inject(:+) # => 6 
0

Hier ist eine Lösung, die sowohl die Werte in einzelnen Iteration (eine Art zu berechnen ein Liner)

r1,r2 = hash.reduce([nil, 0]){|m,(_,v)| [[m[0], v.to_s].compact.join(","),m[-1]+v]} 
#=> ["2,3,1", 6] 
Verwandte Themen