2011-08-03 255 views
0

Ruby的新品牌,並且很喜歡它。只是玩弄下面的代碼:紅寶石數組 - 最高整數

public 
    def highest 
     highest_number = 0 
     each do |number| 
     number = number.to_i 
     highest_number = number if number > highest_number 
     puts highest_number 
     end 
    end 


    array = %w{1 2 4 5 3 8 22 929 1000 2} 
    array.highest 

所以此刻我得到的迴應是:

1 
    2 
    4 
    5 
    5 
    8 
    22 
    929 
    1000 
    1000 

所以它把數組第一,從陣列,以及隨後的最高數字。然而,我希望它只是最高的數字...

我玩過這個,並不能弄明白!對不起,對於這樣一個新手問題

回答

7

問題是你在each循環內有puts語句,所以在每次迭代時它會打印出當前最高的數字。嘗試移動它each外循環,讓你有這樣的:

public 

def highest 
    highest_number = 0 
    each do |number| 
    number = number.to_i 
    highest_number = number if number > highest_number 
    end 
    puts highest_number 
end 

array = %w{1 2 4 5 3 8 22 929 1000 2} 
array.highest 

產生所需的輸出:

1000 
+0

謝謝!真是個傻瓜!當然,非常感謝你! –

+0

它的工作原理!謝謝! –

+6

@Charlie:你可以通過[接受克里斯的回答]來說「謝謝」(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 –

1

你可以做到這一點,而不是和避免highest_number變量。

array = %w{1 2 4 5 3 8 22 929 1000 2} 

class Array 
    def highest 
    collect { |x| x.to_i }. \ 
    sort.     \ 
    last.to_i 
    end 
end 

array.highest # 1000 

collect { |x| x.to_i }也可被寫爲在這種情況下collect(&:to_i)

+0

感謝您的支持!真棒幫助! –

5

您還可以通過使用max_by保存自己的一些麻煩:

>> a = %w{1 2 4 5 3 8 22 929 1000 2} 
=> ["1", "2", "4", "5", "3", "8", "22", "929", "1000", "2"] 
>> m = a.max_by { |e| e.to_i } 
=> "1000" 

您還可以使用的max_by另一個版本:

m = a.max_by(&:to_i) 

避免「塊,只是調用的額外噪音一個方法」。

但是,這可能是一個Ruby塊學習練習,因此使用標準庫的現有部分不計算在內。 OTOH,很高興知道標準庫中的內容,因此推到max_bymax也將算作學習練習。

+0

+1爲最清潔的解決方案,迄今 – apneadiving