2014-10-06 13 views
0

找到一個哈希最低值和最高值,我有以下哈希紅寶石

hash = {"CLIENT1"=>"12.89", "CLIENT2"=>"14.36", "CLIENT3"=>"12.57", "CLIENT4"=>"11.02", "CLIENT5"=>"12.53", "CLIENT6"=>"12.49", "CLIENT7"=>"12.32", "CLIENT8"=>"11.47", "CLIENT9"=>"13.60", "CLIENT10"=>"13.11", "CLIENT11"=>"8.43", "CLIENT12"=>"11.41", "CLIENT13"=>"11.06", "CLIENT14"=>"11.47", "CLIENT15"=>"6.53", "CLIENT16"=>"12.36", "CLIENT17"=>"11.86", "CLIENT18"=>"12.93", "CLIENT19"=>"11.54", "CLIENT20"=>"9.93"} 

當我做hash.values.max我得到9.93 - 這是不正確。 hash.values.min也給我一個不正確的結果11.02

任何人都可以告訴我什麼可能是錯的?如果我只對10個客戶端發出相同的命令,它就會按預期工作。

+0

這是正確的。沒有什麼是錯的。問題不明確。 – sawa 2014-10-06 18:15:16

+1

玩@ sawa的遊戲,這是不正確的,因爲sylvian不能獲得'9.93'或'11.02',因爲這些值都是字符串。人們不需要知道什麼是問題。 – 2014-10-06 18:22:30

+0

@CarySwoveland我解釋說OP只是沒有寫出引號(要麼是因爲他們不知道寫在這裏的正確方法,或者是懶惰的)。 – sawa 2014-10-06 18:34:57

回答

4

您需要將字符串轉換爲浮動(headslapper,eh?)。

a = hash.values.map(&:to_f) 
    #=> [12.89, 14.36, 12.57, 11.02, 12.53, 12.49, 12.32, 11.47, 13.6, 13.11, 
    #  8.43, 11.41, 11.06, 11.47, 6.53, 12.36, 11.86, 12.93, 11.54, 9.93] 
a.max => 14.36 
a.min => 6.53 

"9.1" > "10.2" #=> true 
9.1 > 10.2 #=> false 
+0

嗯,headslapper。我知道那些是字符串,所以ruby正在返回基於字符串序列的最大值? – sylvian 2014-10-06 20:34:24

+0

是的。 Ruby使用方法'<=>'來排序值。比較[Float#<=>](http://www.ruby-doc.org/core-2.1.2/Float.html#method-i-3C-3D-3E),[String#<=>](http:// www.ruby-doc.org/core-2.1.3/String.html#method-i-3C-3D-3E)和[Array#](http://www.ruby-doc.org/core-2.1。 1/Array.html#方法-I-3C-3D-3E)。 – 2014-10-07 02:21:28

1

我會做如下使用#minmax_by方法: -

min, max = hash.minmax_by { |_,v| v.to_f }.map(&:last) 
min # => "6.53" 
max # => "14.36" 
+1

更好,絕對更好。 – 2014-10-06 19:08:13

+0

@CarySwoveland謝謝.. :-) – 2014-10-06 19:08:50