【问题标题】:What does Float::INFINITY do, and why does it work for this sorting method?Float::INFINITY 做什么,为什么它适用于这种排序方法?
【发布时间】:2016-03-01 04:01:09
【问题描述】:

我正在通过一个在线程序学习 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

【问题讨论】:

标签: ruby


【解决方案1】:

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

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

if lowest_value.nil? || v < lowest_value

但它没有那么优雅(并且需要另一个检查,该检查仅在第一次迭代时为真。

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

【讨论】:

  • 谢谢。那讲得通。第一次迭代,值与无穷大进行比较,然后成为下一次迭代中评估的“lowest_value”。所以我创建数组和排序的冗长练习是不必要的。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2013-04-20
相关资源
最近更新 更多