web-dev-qa-db-ja.com

どのようにしてRubyの最小値/最大値を見つけますか?

min(5,10)Math.max(4,7)のように、単純明快なことをしたいのです。 Rubyにはこの効果に対する機能はありますか?

390
obuzek

できるよ

[5, 10].min

または

[4, 7].max

それらは 列挙型モジュール から来ているので、Enumerableを含むものはすべてこれらのメソッドを利用可能にします。

v2.4では独自のArray#minArray#maxが導入されました。これらは#eachの呼び出しをスキップするため、Enumerableのメソッドよりはるかに高速です。

編集

@nicholasklickは別のオプション Enumerable#minmax について言及していますが、今回は[min, max]の配列を返します。

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

あなたが使用することができます

[5,10].min 

または

[4,7].max

これは配列のメソッドです。

51
Diego Dias

これらすべての結果は、3つ以上の引数を処理しようとする熱心な試みでゴミを生成します。私は彼らが善と比較してどのように機能するかを見たいのですが:

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

ところで、あなたの質問に対する私の公式の答えです。 :)

22
Dave Morse

提供された答えに加えて、 Enumerable#max を他の方法のように変数番号または引数を呼び出すことができるmaxメソッドに変換する場合プログラミング言語は、あなたが書くことができます:

def max(*values)
 values.max
end

出力:

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

これは、提供されたすべての引数を含む配列オブジェクト、または引数が指定されていない場合は空の配列オブジェクトを作成するためのsplat演算子のプロパティを悪用します。後者の場合、空の配列オブジェクトに対して Enumerable#max を呼び出すとnilが返されるため、このメソッドはnilを返します。

Mathモジュールでこのメソッドを定義したい場合は、これでうまくいくはずです。

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

Enumerable.maxは、3項演算子(?:)と比較して、少なくとも 2倍遅くなります 。もっと簡単で速い方法については Dave Morseの答え を見てください。

20
HamsterMuffin

ハッシュの最大値/最小値を探す必要がある場合は、#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]
17
aaron-coding