【发布时间】: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
【问题讨论】:
-
你也可以使用reduce来解决这个问题
{a: 1, b: 0.1, c: 3, d: 5}.reduce {|a,b| a[1] < b[1] ? a : b}.first -
我强烈推荐阅读catb.org/esr/faqs/smart-questions.html,尤其是catb.org/esr/faqs/smart-questions.html#idm46397818492288。提出好的问题,不要担心你做了多久。 “How to Ask”和“minimal reproducible example”。
标签: ruby