2016-02-12 38 views
0

我正在通過學​​習Ruby的在線程序學習,其中一個挑戰/課程是編寫一個方法,它接受一個散列值爲全部數字並返回對應於最低值的「鍵」的參數。Float :: INFINITY是做什麼的,爲什麼它對這種排序方法起作用?

我寫了下面的代碼通過了測試,然後顯示了「推薦」的解決方案,這當然是更有效。有人能通過下面的方法的第二個版本來告訴我它是如何完成任務的嗎?

對於挑戰而言,我是不允許使用任何下列方法之一:

#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 
+0

您可以使用reduce來解決這個問題,''{a:1,b:0.1,c:3,d:5 } .reduce {| a,b | a [1]

+0

我強烈建議閱讀http://catb.org/esr/faqs/smart-questions.html,特別是http://catb.org/esr/faqs/smart-questions.html#idm46397818492288。問好問題,不用擔心你做了多久。 「[問]」和「[mcve]」。 –

回答

2

的第二個解決方案工作,因爲你的哈希值不能包含大於Float :: INFINITY的值,所以它是guara保證至少觸發if條件一次。

另一種方法是設置lowest_value = nil,然後在條件做

if lowest_value.nil? || v < lowest_value 

,但它不是優雅(並要求另一個檢查只會是真實的第一次迭代。

另一種辦法要刪除散列中的第一個值並將其設置爲lowest_value,然後循環通過其餘的部分。

+0

謝謝。這就說得通了。第一次迭代時,將值與無窮大進行比較,然後在下一次迭代中成爲評估的「最低值」。所以我創建一個數組和排序的冗長練習是不必要的。我很感激幫助。 –

相關問題