从复杂哈希中查找最大值

时间:2014-09-08 19:24:47

标签: ruby hash

我有复杂的哈希数组,我试图从中找到最大值。我包含两个字段,我希望只从数据集中提取最高值。

这是我的哈希:

hash = {
  0=>nil,
  1=>nil,
  2=>nil,
  3=>nil,
  4=>nil,
  5=>nil,
  6=>nil,
  7=>nil,
  8=>nil,
  9=>nil,
  10=>nil,
  11=>nil,
  12=>nil,
  13=>[{"name"=>"a", "value"=>6.3}],
  14=>[{"name"=>"b", "value"=>1.2}],
  15=>[{"name"=>"c", "value"=>2.5}],
  16=>[{"name"=>"d", "value"=>3.1}],
  17=>[{"name"=>"E", "value"=>1.2}],
  18=>[{"name"=>"f", "value"=>6.3}],
  19=>[{"name"=>"g", "value"=>3.9}],
  20=>[{"name"=>"h", "value"=>3.9}],
  21=>[{"name"=>"i", "value"=>3.9}],
  22=>nil,
  23=>nil
}

我这样想:

for t in 0..hash.size -1
 temp = hash[i].max_by{|a| a[0]["value"].to_i}
end

我只需要此哈希中的最高值,甚至不需要标记。

预期输出应仅为:

temp = 6.3

2 个答案:

答案 0 :(得分:1)

尝试:

temp = hash.values.compact.flatten.map { |h| h["value"] }.max

hash.values.compact返回删除了nil值的哈希值数组。数组被展平,value仅检索.map { |h| h.fetch('value') }键的值,然后在结果数组上应用Enumerable#max方法。

> hash = {0=>nil, 1=>nil, 2=>nil, 3=>nil, 4=>nil, 5=>nil, 6=>nil, 7=>nil, 8=>nil, 9=>nil, 10=>nil, 11=>nil, 12=>nil, 13=>[{"name"=>"a", "value"=>6.3}], 14=>[{"name"=>"b", "value"=>1.2}], 15=>[{"name"=>"c", "value"=>2.5}], 16=>[{"name"=>"d", "value"=>3.1}], 17=>[{"name"=>"E", "value"=>1.2}], 18=>[{"name"=>"f", "value"=>6.3}], 19=>[{"name"=>"g", "value"=>3.9}], 20=>[{"name"=>"h", "value"=>3.9}], 21=>[{"name"=>"i", "value"=>3.9}], 22=>nil, 23=>nil}
> hash.values.flatten.compact.map { |h| h.fetch("value") }.max
=> 6.3

答案 1 :(得分:1)

假设nil值无关紧要,我会做类似的事情:

hash = {
  0=>nil,
  12=>nil,
  13=>[{"name"=>"a", "value"=>6.3}],
  14=>[{"name"=>"b", "value"=>1.2}],
  15=>[{"name"=>"c", "value"=>2.5}],
  16=>[{"name"=>"d", "value"=>3.1}],
  17=>[{"name"=>"E", "value"=>1.2}],
  18=>[{"name"=>"f", "value"=>6.3}],
  19=>[{"name"=>"g", "value"=>3.9}],
  22=>nil,
  23=>nil
}

hash.values.select{ |v| v }.map{ |v| v.first['value'] }.max # => 6.3

如果nils很重要,并且可以获得nil值或者数组中的哈希值,那么我会做类似的事情:

hash = {
  0=>nil,
  18=>[{"name"=>"f", "value"=>6.3}],
}

hash.values.map{ |v| 
  Array === v ? v.first['value'] : -0.0
}.max # => 6.3

我将默认-0.0设置为通常不会发生的明显值。它被返回将表明没有设置其他值。


  

这不是返回最后一个值3.9

该示例输出直接来自我的Ruby,所以我知道它有效。也许这是你的Ruby版本。这是我的:

RUBY_VERSION # => "2.1.2"