Enumerable.min_by / max_by / minmax / minmax_by
| 対応: | Ruby 1.9(2007) |
|---|
コレクションから最小値・最大値を持つ要素を取得するメソッドです。ブロックで評価基準を指定できます。
構文
# ブロックの戻り値が最小の要素を返します。
コレクション.min_by { |要素| 評価式 }
# ブロックの戻り値が最大の要素を返します。
コレクション.max_by { |要素| 評価式 }
# 最小値と最大値の要素を [min, max] の配列で返します。
コレクション.minmax_by { |要素| 評価式 }
# 自然順序での最小・最大を直接取得します。
コレクション.min
コレクション.max
コレクション.minmax
メソッド一覧
| メソッド | 概要 |
|---|---|
| min_by | ブロックの戻り値が最小になる要素を返します。 |
| max_by | ブロックの戻り値が最大になる要素を返します。 |
| minmax_by | 最小と最大の要素を『[min, max]』の配列で返します。 |
| min | コレクションの最小値を返します。ブロックで比較方法を指定することもできます。 |
| max | コレクションの最大値を返します。ブロックで比較方法を指定することもできます。 |
| minmax | 最小値と最大値を『[min, max]』の配列で返します。 |
サンプルコード
sample_enumerable_min_by_max_by.rb
# 数値配列の最小・最大を取得します。
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
puts numbers.min # 1
puts numbers.max # 9
puts numbers.minmax.inspect # [1, 9]
# ハッシュの配列から特定のキーで最小・最大を取得します。
members = [
{ name: "桐生一馬", power: 95 },
{ name: "真島吾朗", power: 88 },
{ name: "冴島大河", power: 98 },
{ name: "秋山駿", power: 72 }
]
weakest = members.min_by { |m| m[:power] }
puts weakest[:name] # 秋山駿
strongest = members.max_by { |m| m[:power] }
puts strongest[:name] # 冴島大河
min_and_max = members.minmax_by { |m| m[:power] }
puts min_and_max.map { |m| m[:name] }.inspect # ["秋山駿", "冴島大河"]
# 文字列を長さで比較します。
words = ["cat", "elephant", "ox", "hippopotamus"]
puts words.min_by { |w| w.length } # ox
puts words.max_by { |w| w.length } # hippopotamus
ruby enumerable_min_by_max_by.rb 1 9 [1, 9] 秋山駿 冴島大河 ["秋山駿", "冴島大河"] ox hippopotamus
概要
『min_by』と『max_by』はEnumerableモジュールのメソッドで、ブロックで返した値をもとに最小・最大の要素を取得します。ハッシュの配列から特定のキーで並べ替えて取得する際によく使われます。
ブロックなしの『min』・『max』は要素の自然順序(数値は数値順、文字列はアルファベット順)で比較します。空のコレクションに対して呼び出すと『nil』を返すため、戻り値を使う前に確認が必要です。複数の最小・最大を取得したい場合は『min(n)』・『max(n)』のように引数を指定すると上位n件を配列で取得できます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。