7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby Hash のvalueから最大値を求める方法と解説

Last updated at Posted at 2019-05-11

Rubyのハッシュの値の最大値を求めるときに使う

qiita.rb
menu = {"pizza": 2000, "coke": 150, "spaghetti": 800}
# 最も高い値段のメニューを出す
p menu.max{ |x, y| x[1] <=> y[1] }
# [:pizza, 2000]
qiita.rb
menu.max{ |x, y| x[1] <=> y[1] }

これが何やってんのかよくわからないから調べてみた。

ちなみにhashにmaxメソッドを使うと
keyで最も長い文字列のspaghettiが呼ばれてしまう
たぶん、配列x=[key, value]、y=[key, value]みたいな感じで入ってると思う。。。
デフォルトでは比較されるのがkeyであるx[0],y[0]になっているので、keyである文字列で比較され、その文字数の最大値である [:spaghetti, 150] が返される。

訂正
アルファベット順で最も後ろの文字列が呼ばれます。

default.rb
p menu.max
# [:spaghetti, 150]
p menu.max{ |x, y| x[0] <=> y[0] } #上と一緒
# [:spaghetti, 150]

今回はハッシュの値で比較するために、
以下で比較できる。
つまり、配列x=[key, value], y=[key, value]の2番目のインデックス(hashの時valueだったやつ)で比較している。

value.rb
p menu.max{ |x, y| x[1] <=> y[1] }
# [:pizza, 2000]

ご指摘してもらった以下の方がわかりやすい!

qiita.rb
p menu.max{ |(_key0,value0),(_key1,value1)| value0<=>value1 }
# => [:pizza, 2000]

ちなみに、<=>演算子は左が大きいと1, 等しいと0, 小さいと-1を返す。
これを使ってそれぞれのvalueを比較していってるっぽいです。(たぶん

qiita.rb
a = 10
b = 1
c = 1
p a <=> b  # 1
p b <=> a  # -1
p b <=> c  # 0

追記
max_byの方がわかりやすい

qiita.rb
p menu.max_by{ |(_key0,value0)| (_key0,value0)[1] }
# => [:pizza, 2000]
7
5
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?