2014-10-06 174 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