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]