Rubyで最小/最大を見つける方法


415

使用したいmin(5,10)、またはMath.max(4,7)。Rubyでこの効果を発揮する関数はありますか?

回答:


723

できるよ

[5, 10].min

または

[4, 7].max

これらはEnumerableモジュールからのものであるため、インクルードEnumerableするものはすべてそれらのメソッドを使用できます。

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

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

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

3
@kazよくわかりません。
ジギー

3
@カズ...あなたstd::max(4, 7)はより多くの「句読点」を持っていることに気づき[4, 7].maxますか?
tckmn 2014年

3
@Doorknob std::max名前空間にインポートできるので、名前空間になるだけだとわかりますmax(4, 7)。待つ; 上を見れば、私はすでにそれを言ったのを見る。
Kaz

18
ここでは句読点は問題ではありません。いくつかの値の最大値を取得するためのヒープ全体の割り当ては、ここでは根本的な醜さです。
kdbanman 2015年

7
Rubyは主にプログラマー向けであり、コンピューター向けではありません。Matzの言葉で、「Rubyが世界中のすべてのプログラマーの生産性を高め、プログラミングを楽しみ、幸せになるのを助けることを期待しています。それがRuby言語の主な目的です。」RubyのWikipediaページからです。
アーロンコーディング、2015

52

使用できます

[5,10].min 

または

[4,7].max

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


20
技術的には、配列ではなく、列挙型のメソッドです。
貧弱

1
これは、v2.4以降、Enumerableよりも優れたパフォーマンスを持つ配列のメソッドです
Andre Figueiredo

25

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

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

ちなみに、これはあなたの質問に対する私の公式回答です。


Ruby 2.4が最適化していること[a,b].maxにはいくつかの問題がありますが、上記の実装よりも高速かどうかはまだ明確ではありません。 blog.bigbinary.com/2016/11/17/...
デイブモールス

2
これは差はごくわずかである、彼らは非常に高速の両方をしている、マイクロ最適化され、ベンチマークを参照してください。repl.it/@AndreFigueiredo/DearWeirdSweepsoftware
アンドレ・フィゲイレド

1
このプロファイリングは、GCで費やされた時間を考慮していますか?
デイブモールス

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

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

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

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

Enumerable.maxは、3項演算子(?:)と比較して、少なくとも2倍遅いことに注意してください。よりシンプルで高速な方法については、Dave Morseの回答を参照してください。


しかし、標準のクラスとモジュールを再度開くことは悪い習慣とは考えられていませんか?
radiantshaw

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.