Что делает 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, затем переберите все остальное.

Другие вопросы по тегам