Ruby 条件を指定して、配列の最大値と最小値を求める

  • 作成日 2021.09.24
  • 更新日 2022.08.03
  • Ruby
Ruby 条件を指定して、配列の最大値と最小値を求める

Rubyで、max_byとmin_byを使用して、条件を指定して、配列の最大値と最小値を求めるサンプルコードを記述してます。rubyのバージョンは2.7.2を使用してます。

環境

  • OS windows10 pro 64bit
  • ruby 2.7.2p137

max_byとmin_by使い方

maxとminを使用すれば、条件を指定して、配列の最大値と最小値を求めることが可能です。

配列.max_by{|x| 条件}
配列.min{|x| 条件}

以下は、条件を指定して、条件を絶対に指定して、配列の最大値と最小値を求めるサンプルコードとなります。

arr = [-7, 5, 6 , 1, -2]

p arr.max_by {|x| x.abs }
# -7

p arr.min_by {|x| x.abs }
# 1

割り算の余りなどにも利用できます。結果は、一番最初に見つかったものが返されます。

arr = [1, 2, 3, 4, 5 ,6]

p arr.max_by {|x| x % 3 }
# 2

p arr.min_by {|x| x % 3 }
# 3

上記はmax,minを使用して以下のように書くこともでき、こちらの方がパフォーマンスは良さそうです。

arr = [1, 2, 3, 4, 5 ,6]

p arr.max {|x,y| x % 3 <=> y % 3}
# 2

p arr.min {|x,y| x % 3 <=> y % 3 }
# 3

【参考】 同じコードを1000万回実行した結果

                 user     system      total        real
#max_by      6.579000   0.000000   6.579000 (  6.646934)
#max         5.031000   0.000000   5.031000 (  5.040569)

また、minmax_byを使用して最大値と最小値を同時に求めることも可能です。

arr = [1, 2, 3, 4, 5 ,6]

p arr.minmax_by {|x| x % 3 }
# [3, 2]

また、異なる型が配列に含まれているとエラーとなります。

arr = [1, 2, "3", 4, 5 ,6]

p arr.max_by {|x| x % 3 }
# in `each': comparison of String with 1 failed (ArgumentError)

なので、一度、数値に変換する必要があります。

arr = [1, 2, "3", 4, 5 ,6]

p arr.max_by {|x| x.to_i % 3 }
# 2