我正在通过一个在线程序学习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
,然后遍历其余值。