我有复杂的哈希数组,我试图从中找到最大值。我包含两个字段,我希望只从数据集中提取最高值。
这是我的哈希:
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
答案 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"