루비로 최소 / 최대를 찾는 방법


415

min(5,10)또는 을 사용하고 싶습니다 Math.max(4,7). Ruby에이 효과에 대한 기능이 있습니까?

답변:


722

넌 할 수있어

[5, 10].min

또는

[4, 7].max

그들은에서 온 Enumerable에서 모듈 이 포함되어 아무것도, 그래서 Enumerable그 방법을 사용할 수있을 것이다.

v2.4에는 자체 및가 도입되어 Array#min있으며 Array#max, 이는 호출을 건너 뛰기 때문에 Enumerable의 방법보다 훨씬 빠릅니다 #each.

@nicholasklick은 다른 옵션을 언급 Enumerable#minmax하지만 이번에는의 배열을 반환합니다 [min, max].

[4, 5, 7, 10].minmax
=> [4, 10]

3
@kaz 나는 당신의 의견을 이해하지 못합니다.
Ziggy

3
@Kaz ... 당신 std::max(4, 7)은 "구두"보다 더 많은 것을 알고 [4, 7].max있습니까?
tckmn

3
@Doorknob std::max네임 스페이스로 가져올 수 있다는 것을 알고 있습니다 max(4, 7). 기다림; 위에서 보면, 나는 이미 말했다.
Kaz

18
문장 부호는 여기서 문제가되지 않습니다. 몇 가지 값을 최대로 얻기위한 전체 힙 할당은 기본적인 추악입니다.
kdbanman

7
루비는 주로 컴퓨터가 아닌 프로그래머를위한 것입니다. Matz의 말에 따르면 "Ruby가 전 세계의 모든 프로그래머가 생산성을 높이고 프로그래밍을 즐기며 행복하게하는 데 도움이되기를 바랍니다. 이것이 Ruby 언어의 주요 목적입니다." Ruby의 Wikipedia 페이지에 있습니다.
aaron-coding

52

당신이 사용할 수있는

[5,10].min 

또는

[4,7].max

배열을위한 방법입니다.


20
기술적으로 배열이 아닌 열거 가능 메서드입니다.
meagar

1
v2.4 이후 Enumerable보다 우수한 성능을 가진 어레이를위한 방법입니다.
Andre Figueiredo

25

이러한 모든 결과는 세 개 이상의 인수를 처리하려는 열의로 가비지를 생성합니다. 나는 그들이 좋은 'ol과 비교하여 그들이 어떻게 수행되는지 궁금합니다.

def max (a,b)
  a>b ? a : b
end

그건 그렇고, 당신의 질문에 대한 공식 답변입니다.


Ruby 2.4가 최적화하고있는 몇 가지 문제가 [a,b].max있지만, 위의 구현보다 빠른지 확실하지 않습니다. blog.bigbinary.com/2016/11/17/…
Dave Morse

2
이 차이는 무시할 수있다, 그들은 너무 빨리 모두있어, 마이크로 최적화하고, 벤치 마크를 참조하십시오 repl.it/@AndreFigueiredo/DearWeirdSweepsoftware
앙드레 Figueiredo의

1
이 프로파일 링은 GC에서 보낸 시간을 고려합니까?
Dave Morse

20

해시의 최대 / 최소를 찾아야하는 경우 #max_by또는#min_by

people = {'joe' => 21, 'bill' => 35, 'sally' => 24}

people.min_by { |name, age| age } #=> ["joe", 21]
people.max_by { |name, age| age } #=> ["bill", 35]

20

제공된 답변 외에도 Enumerable # max 를 다른 프로그래밍 언어와 같이 변수 번호 또는 인수를 호출 할 수있는 max 메서드로 변환 하려면 다음을 작성할 수 있습니다.

def max(*values)
 values.max
end

산출:

max(7, 1234, 9, -78, 156)
=> 1234

이것은 splat 연산자의 속성을 남용하여 제공된 모든 인수를 포함하는 배열 객체를 만들거나 인수가 제공되지 않은 경우 빈 배열 객체를 만듭니다. 후자의 경우 빈 배열 객체에서 Enumerable # maxnil호출 하면이 반환 되므로이 메서드는을 반환 합니다 nil.

Math 모듈에서이 메소드를 정의하려면 다음을 수행해야합니다.

module Math
 def self.max(*values)
  values.max
 end
end

Enumerable.max는 삼항 연산자 ( ?:)에 비해 적어도 두 배 느립니다 . 더 간단하고 빠른 방법 은 Dave Morse의 답변 을 참조하십시오 .


그러나 표준 클래스와 모듈을 다시 열면 나쁜 습관으로 간주되지 않습니까?
radiantshaw

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.