Что делает Float::INFINITY и почему он работает для этого метода сортировки?
Я пробираюсь через онлайн-программу, изучающую Ruby, и одной из задач / уроков было написание метода, который принимает аргумент хэша, все значения которого являются числами, и возвращает "ключ", соответствующий наименьшему значению.
Я написал следующий код, который прошел тест, после чего было показано "рекомендуемое" решение, которое, конечно, было гораздо более эффективным. Может ли кто-нибудь провести меня через вторую версию метода ниже и сказать мне, как он выполняет задачу?
В целях вызова мне не разрешили использовать любой из следующих методов:
#keys
#values
#min
#sort
#min_by
Мое решение:
def key_for_min_value(name_hash)
lowest_key = nil
if name_hash != {}
value_array=name_hash.collect do |key,value|
value
end
loop do
swapped = false
(value_array.length-1).times do |i|
if value_array[i] > value_array[i+1]
value_array[i], value_array[i+1] = value_array[i+1], value_array[i]
swapped=true
end
end
break if not swapped
end
name_hash.each do |key,value|
if value == value_array.first
lowest_key = key
end
end
end
lowest_key
end
Рекомендуемое решение:
def key_for_min_value(hash)
lowest_key = nil
lowest_value = Float::INFINITY
hash.each do |k, v|
if v < lowest_value
lowest_value = v
lowest_key = k
end
end
lowest_key
end
1 ответ
Второе решение работает, потому что ваш хеш не может содержать значение больше, чем Float::INFINITY, поэтому он гарантированно вызовет if
состояние хотя бы один раз.
Альтернативой было бы установить lowest_value = nil
а потом в состоянии сделать
if lowest_value.nil? || v < lowest_value
но это не так элегантно (и требует еще одной проверки, которая будет верна только на первой итерации.
Другой альтернативой было бы удалить первое значение в хэше и установить его в lowest_value
, затем переберите все остальное.