0
0

配列の中に入っているハッシュの値が大きい順に並び替える

Last updated at Posted at 2024-02-18

やりたいこと

配列の中に入っているハッシュの値が大きい順に並び替えたい。

[{:name=>"player1", :count=>21},
{:name=>"player2", :count=>0}, 
{:name=>"player3", :count=>30}]

このように並び替えたい。↓

[{:name=>"player3", :count=>30}, 
{:name=>"player1", :count=>21}, 
{:name=>"player2", :count=>0}, ]

考えたこと

「配列の要素を並び替えるのにsortメソッドというのがあったはず。sortメソッドを使えば並び替えられるかな」

試したこと

公式リファレンスをもとにsortメソッドを使ってみる。
今回は各要素がハッシュの形をしており、:countキーの値を比較する。

a = [{:name=>"player1", :count=>4},
 {:name=>"player2", :count=>28},
 {:name=>"player3", :count=>20},
 {:name=>"player4", :count=>0}]
 
a.sort do |a, b|
  a[:count] <=> b[:count]
end

:countキーの値が小さい順に並び替えることができた。

=> 
[{:name=>"player4", :count=>0},
 {:name=>"player1", :count=>4},
 {:name=>"player3", :count=>20},
 {:name=>"player2", :count=>28}]

破壊的メソッドsort!で配列そのものを並び替えたあと、reverseメソッドを使うと大きい順に並び替えることができた。

irb(main):038* a.sort! do |a, b|
irb(main):039*   a[:count] <=> b[:count]
irb(main):040> end
=> 
[{:name=>"player4", :count=>0},
 {:name=>"player1", :count=>4},
 {:name=>"player3", :count=>20},
 {:name=>"player2", :count=>28}]
irb(main):041> a.reverse
=> 
[{:name=>"player2", :count=>28},
 {:name=>"player3", :count=>20},
 {:name=>"player1", :count=>4},
 {:name=>"player4", :count=>0}]

失敗例1

reverseメソッドをつなげて大きい順に並び替えようとするとできない。

a.sort.reverse do |a, b|
irb(main):029*   a[:count] <=> b[:count]
irb(main):030> end
(irb):28:in `sort': comparison of Hash with Hash failed (ArgumentError)

失敗例2

sort_byメソッドで同じことをやろうとするとできない。(sort_by!メソッドでも同じ結果になる)

irb(main):046* a.sort_by do |a, b|
irb(main):047*   a[:count] <=> b[:count]
irb(main):048> end
(irb):47:in `block in <top (required)>': undefined method `[]' for nil (NoMethodError)

成功例2

ブロックパラメータの数(ブロックに渡す数)を1つにすると、sort_byでも並び替えることができる。

irb(main):052* a.sort_by do |a|
irb(main):053*   a[:count]
irb(main):054> end
=> 
[{:name=>"player4", :count=>0},
 {:name=>"player1", :count=>4},
 {:name=>"player3", :count=>20},
 {:name=>"player2", :count=>28}]

学んだこと

sortメソッドはブロックパラメータに2つの要素を渡せるが、sort_byメソッドは1つしか渡せない。

参考記事

Ruby公式リファレンス(sort)
Rubyの配列の中のハッシュのソート

0
0
2

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
0
0