らぼらとり

koutya07の日記、備忘録

ruby hashとか

配列を値に持つハッシュを作りたかったんだけど、初期値を単に空配列にするとすべてのキーで同一の配列を参照してしまうらしい

hash = Hash.new([])
hash[:foo] << 1  #=> [1]
hash[:bar] << 2  #=> [1,2]
hash[:buz] << 3  #=> [1,2,3]
hash[:hoge]      #=> [1,2,3]

こうするとキーごとに配列をもてるようになる

hash = Hash.new{|hash, key| hash[key] = []}
hash[:foo] << 1  #=> [1]
hash[:bar] << 2  #=> [2]
hash[:buz] << 3  #=> [3]
hash[:hoge]      #=> []

めでたしめでたし。


で、そのハッシュの値の配列要素の個数順でソートかけたかったんだけど

hash = hash.sort_by{|key, val| -val.size}.to_h

こうやって一応動いてはいるんだけど、Hashの破壊的ソートってもしかしてあるんですかね?
sort_by!ってやったら怒られた