2014-09-08 5 views
-1

У меня есть сложный массив хэшей, и я пытаюсь найти максимальное значение из него. Я содержит два поля, и я хочу извлечь только самое высокое значение из набора данных.Найти максимум из сложного хэша

Вот мой хэш:

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

Когда вы приводите примеры/образцы данных, уменьшите их до минимума, необходимого для демонстрации проблемы. Все, что выходит за рамки этого, является пустой тратой нашего времени и замедляет и отговаривает ответы. –

+0

Что делать, если все значения хэша равны нулю? Какую ценность вы хотите вернуть? –

+0

Это также работает: 'hash.to_s.scan (/ (? <==>) -? \ D + (?: \. \ D +)? /). Map (&: to_f) .max => 6.3'. –

ответ

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 

Если Нильс являются значительными, и это возможно, чтобы получить оба нулевые значения или хэш-в-в-массиве , то я хотел бы сделать что-то вроде:

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" 
+1

no это возвращает последнее значение, которое равно 3.9 – user3290805

+0

Что такое? Он работает правильно в моей системе –

+0

ага да это сработало мое плохое ... Спасибо ... – user3290805

1

Try:

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