2011-08-03 3 views
0

Ruby에 새롭고 사랑합니다. 그냥 아래의 코드로 장난 :Ruby Array - 가장 높은 정수

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 문을 가지고 있기 때문에 모든 반복 중에 현재 가장 높은 번호가 인쇄됩니다. 원하는 출력을 생성

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 : [Chris의 답변 수락] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)으로 "감사"라고 말하면됩니다. –

1

당신은 대신이 작업을 수행 할 수 있으며, highest_number 변수를 피하기이있을 수 있도록 each 루프 외부로 이동하십시오.

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를 사용하여 자신에게 몇 가지 문제를 절약 할 수있다 :

m = a.max_by(&:to_i) 

그냥 호출 "블록의 여분의 소음을 피하기 위해 :

>> 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의 다른 버전을 사용할 수 있습니다 방법".

그러나 이것은 아마도 Ruby가 학습 과제를 차단하여 아마도 표준 라이브러리의 기존 부분을 사용하면 계산에 포함되지 않을 것입니다. OTOH, 표준 라이브러리에있는 내용을 알고 있으면 max_by 또는 max으로 펀칭하면 학습 연습으로 간주됩니다.

+0

+1 가장 깨끗한 해결책 – apneadiving

관련 문제