配列に対して 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 }
min
や max
は、異なる型のオブジェクトを含む配列に対して実行しようとするとエラーになりますが、下記のように適切な比較ロジックを定義することによって、異なる型の値を比較できるようにできます。
[1, 2, '3'].minmax {|a,b| a.to_i <=> b.to_i } # => [1, "3"]