まくまくRubyノート
最大値/最小値を求める (min/max/minmax)
2011-10-15

配列内の値の最大値/最小値を求める

配列に対して min, max を使用できます。

[1, 5].min  # => 1
[1, 5].max  # => 5
[1, 3, 5].min # => 1
[1, 3, 5].max # => 5
['a', 'b', 'c'].min  #=> 'a'
['a', 'b', 'c'].max  #=> 'c'

配列が空の場合は nil を返します。

[].min  # => nil
[].max  # => nil
[nil].min  # => nil
[nil].max  # => nil

異なる型のオブジェクトが配列内に含まれているとエラーになります。

[nil, 1, 5].min  # => Error!
[nil, 1, 5].max  # => Error!
[1, 2, 'AAA'].min  # => Error!
[1, 2, 'AAA'].max  # => Error!

最大値/最小値を同時に求める

minmax メソッドを使うと、最小値と最大値を同時に求めることもできます。 戻り値はサイズ 2 の配列になります。

[3, 5, 1, 2, 4].minmax  # => [1, 5]

独自オブジェクトを比較できるようにする

配列の中に独自オブジェクトを含んでいる場合は、比較方法をブロックで定義する事ができます(min, max, minmax すべて共通)。 a > b のときに正、a == b のときに 0、a < b のときに負の値を返すように実装します。

[obj1, obj2, obj3].max {|a, b| a.age <=> b.age }

minmax は、異なる型のオブジェクトを含む配列に対して実行しようとするとエラーになりますが、下記のように適切な比較ロジックを定義することによって、異なる型の値を比較できるようにできます。

[1, 2, '3'].minmax {|a,b| a.to_i <=> b.to_i }  # => [1, "3"]
2011-10-15