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
第二种

解决方案之所以有效,是因为您的哈希不能包含大于 Float::INFINITY 的值,因此可以保证至少触发一次if条件。

另一种方法是设置lowest_value = nil,然后在该条件下执行

if lowest_value.nil? || v < lowest_value

但它没有那么优雅(并且需要另一次检查,这仅在第一次迭代时才是正确的。

另一种选择是删除哈希中的第一个值并将其设置为 lowest_value ,然后遍历其余值。

相关内容

最新更新